お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"RE:斜め楕円の描画"

この発言は
#00593 裏目小僧 さんの斜め楕円の描画
に対するコメントです

裏目小僧さん みなさん こんにちは 凛です。 裏目さんにnifty:FDELPHI/MES/9/03154で教えて頂いたことを使って 任意の角度から任意の角度まで任意の角度傾けた楕円を描く関数を作りました。 裏目さん以外にもたくさんの方からヒント頂きました。 ご指導どうもありがとうございました。 formにボタンを一つ置いて、usesにmathを追加して下さい。 procedure drawDeclinedEllipseP(canvas:TCanvas; //描画キャンバス centerX,centerY, //中心座標 LongRadius,ShortRadius,//長径 短径 Angle, //傾き angleFrom,//何度から angleTo //何度まで :Extended); type TExPoint=Record x,y:Extended; end; const err=0.001; var sep,i:integer; division:Extended; //点を(0,0)まわりで回転させる function rot(x,y:Extended;rad:Extended):TExPoint;//rad:radian var ss,cc:Extended; begin ss:=sin(rad); cc:=cos(rad); result.x:=cc*x-ss*y; result.y:=ss*x+cc*y; end; //90度位以下を描画 ここに来るまでに角度は全てradianに変換されている procedure drawDeclinedEllipsePP(aFrom, //何度から radian aTo //何度まで radian :Extended); var j:integer; bufP:array[0..3]of TExPoint; thePoints:array[0..3] of TPoint; s,c,xc,yc,fa:Extended; begin fa:=aTo-aFrom; s:=sin(fa); c:=cos(fa); xc:=cos(fa/2); //中点の座標 yc:=sin(fa/2); bufP[0].x:=1; bufP[0].y:=0; bufP[1].x:=1; bufP[1].y:=-4*c*(1+c-2*xc)/s/3+4*(2*yc-s)/3; bufP[2].x:=(-4-c+8*xc)/3; bufP[2].y:= 4*c*(1+c-2*xc)/s/3+s; bufP[3].x:=c; bufP[3].y:=s; for j:= 0 to 3 do begin //開始と終わりを回転させる bufP[j]:=rot(BufP[j].x,bufP[j].y,aFrom); //全体を回転させる 楕円にする(x、yの伸縮をする) bufP[j]:=rot(LongRadius*BufP[j].x,shortRadius*BufP[j].y,angle); //平行移動 thePoints[j].x:=round(bufP[j].x+centerX); thePoints[j].y:=round(bufP[j].y+centerY); end; PolyBezier(Canvas.Handle,thePoints,4); end; begin division :=pi/3;//60度分割 angle :=degTorad(angle); angleFrom:=degToRad(angleFrom); angleTo :=degTorad(angleTo); sep :=Trunc((AngleTo-AngleFrom)/division); //divisionで分割してdivisionづつ描く for i:=0 to sep-1 do begin drawDeclinedEllipsePP(angleFrom+i*division, angleFrom+(i+1)*division); end; //残りを描く if (AngleTo-AngleFrom)-(sep*division)>err then drawDeclinedEllipsePP(angleFrom+sep*division, angleTo); end; procedure TForm1.Button1Click(Sender: TObject); const da=340;//20度欠けた楕円を描く var a,i:integer; begin for a:=0 to 9 do begin for i:= 0 to 36 do //一回転させる begin //消す canvas.Pen.color:=color; drawDeclinedEllipseP(canvas,200,200,100,200,a*10,i*10,i*10+da); //描く canvas.Pen.color:=clRed; drawDeclinedEllipseP(canvas, 200, 200, 100, 200, a*10,(i+1)*10, (i+1)*10+da); sleep(30); end; end; end; 98/07/11(土) 09:17 凛(MXB01744) Original document by 凛 氏 ID:(MXB01744)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum