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
|