16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"線のクラス"
この発言に対し以下のコメントが寄せられています
#00726 凛 さん RE:線のクラス
//イメージに選択可能な線を引くときに使います。
TLine=class
private
w,col,sx,sy,ex,ey:integer;
public
function isOnLine(x,y:integer):boolean;
procedure draw(theCanvas:TCanvas;penmode:Tpenmode);
constructor create(startX,startY,endX,EndY,width,color:integer);
end;
//イカはimplementationに
function TLine.isOnLine(x,y:integer):boolean;
var
r,a,b,c,d,kx,ky,dx,dy:Extended;
begin
isOnLine:=false;
dx:=ex-sx;
dy:=ey-sy;
if dx=0 then//垂直線
begin
if abs(sx-x)<=1 then isOnLine:=True;
end
else
begin
if dy=0 then//水平線
begin
if abs(sy-y)<=1 then isOnLine:=True;
end
else
begin
//線からの距離が幅の1/2にあるかどうかを見る
//先にそれぞれの端から線幅以上離れていないかみる
if ((sx+ex)-abs(dx)-w)/2 > x then exit;
if ((sx+ex)+abs(dx)+w)/2 < x then exit;
if ((sy+ey)-abs(dy)-w)/2 > y then exit;
if ((sy+ey)+abs(dy)+w)/2 < y then exit;
a:=dy/dx;
b:=sy-a*sx;
c:=-1/a;
d:=y-c*x;
kx:=(d-b)/(a-c);
ky:=a*kx+b;
r:=(x-kx)*(x-kx)+(y-ky)*(y-ky);
if 4*r<= (w+1)*(w+1) then
isOnLine:=True;
end;
end;
end;
procedure TLine.draw(theCanvas:TCanvas;penmode:Tpenmode);
begin
theCanvas.Pen.Color:=col;
theCanvas.pen.Width:=w;
theCanvas.pen.mode:=penmode;
theCanvas.moveTo(sx,sy);
theCanvas.LineTo(ex,ey);
end;
constructor TLine.create(startX,startY,endX,EndY,width,color:integer);
begin
sx:=startX;
sy:=startY;
ex:=endX;
ey:=endY;
w:=width;
col:=color;
end;
使うときは
newLine:=TLine.create(Origin.X,
Origin.Y,
LastPoint.X,
LastPoint.Y,
LineWidth,
LineColor);
newLine.draw(image1.canvas,pmCopy);
LineList.add(newLine);//前もってcreateしておいたTList
というかんじ
クリックされたとき線が選択されたか線を反転させる場合
MouseDownイベント等で
for i:=0 to LineList.count-1 do
begin
with TLine(LineLIst.Items[i]) do
begin
if isOnLine(x,y) then
begin
LineAtFocus:=i;//どの線が選択されたか知りたい場合
draw(image1.canvas,pmNot);//ここのモードは好みに応じて
break;
end;
end;
end;
☆☆☆ かわいいコードにゃ旅をさせよう いざサンプル蔵へ!! ☆☆☆
97/12/13(土) 10:21 凛(MXB01744)
Original document by 凛 氏 ID:(MXB01744)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|