跪求,已知一任意椭圆的圆心坐标和长短轴距离,如何绘制该旋转椭圆?

sucan 2008-04-06 01:06:23
已知一任意椭圆的圆心坐标和长短轴距离,如何绘制该旋转椭圆?网上找N久了,只有VC代码的,功力不够,一直改不好,大家帮忙啊!!!
-----思路是算出13个点坐标,然后用贝塞尔曲线拟合椭圆,帮帮忙啊,有完整代码最好,分不够再开贴加,谢谢啦
...全文
884 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oraplsql 2010-12-21
  • 打赏
  • 举报
回复
??????????????????????
pidoudou 2010-07-16
  • 打赏
  • 举报
回复
????????
oushengfen 2008-04-14
  • 打赏
  • 举报
回复
一个数学问题,来实现,呵呵.
skylkj 2008-04-14
  • 打赏
  • 举报
回复
椭圆的定义是到两个焦点的距离和为定值

最直接的想法就是扫描图上各点(可根据焦点位置缩小扫描范围),凡是到焦点距离和为需要的常数值的点画成黑点
JLBOY 2008-04-09
  • 打赏
  • 举报
回复
支持
22222bbb 2008-04-09
  • 打赏
  • 举报
回复
高手....
dext 2008-04-07
  • 打赏
  • 举报
回复
Canvas.Ellipse(100, 200 ,300 ,250);
dext 2008-04-07
  • 打赏
  • 举报
回复
var
points : array [0.. 360] of TPoint;
i: Integer;
X, Y, A, B: Integer;
begin
X:= Self.Width div 2;
Y:= Self.Height div 2;
A:= 100;
B:= 40;
for i:= 0 to 360 do begin
points[i].X:= Round(A * Cos(PI / 180 * i)) + X;
points[i].Y:= Round(B * Sin(PI / 180 * i)) + Y;
end;
Canvas.Polyline(points);
end;
neweipeng 2008-04-07
  • 打赏
  • 举报
回复
结果是间隔45°角的4个椭圆(X, Y:为中心 A, B为长短轴)
neweipeng 2008-04-07
  • 打赏
  • 举报
回复

uses Math;

procedure TForm1.Button1Click(Sender: TObject);
var
points : array [0.. 360] of TPoint;
i,j: Integer;
X, Y, A, B: Integer;
xlen,ylen,len,angle:Extended;
begin
X:= Self.Width div 2;
Y:= Self.Height div 2;
A:= 100;
B:= 40;
j:=0;
while j<360 do
begin
for i:= 0 to 360 do begin
xlen:=A * Cos(PI / 180 * i);
ylen:=B * Sin(PI / 180 * i);
len:=sqrt(xlen*xlen+ylen*ylen);
angle:=ArcSin(ylen/len)+ PI / 180 * j;
xlen:=len*Cos(angle);
ylen:=len*Sin(angle);
points[i].X:= Round(xlen) + X;
points[i].Y:= Round(ylen) + Y;
end;
Canvas.Polyline(points);
inc(j,45);//旋转递增角度
end;
end;


sucan 2008-04-07
  • 打赏
  • 举报
回复
谢谢啊,我要的是旋转的任意的椭圆,上面的方法都是平行于X、Y轴的啊
sucan 2008-04-06
  • 打赏
  • 举报
回复
来人啦,救命啊,帮忙呵
sucan 2008-04-06
  • 打赏
  • 举报
回复
-------自己顶,找了个以前的帖子-------------
const
r: Double = 0.2761423749154; 

Center为椭圆中心、mb为短半轴、ma为长半轴
得到13个点
P[0].x := Center.x;
P[0].y := Center.y + mb;
P[1].x := Center.x + 2 * ma * r;
P[1].y := Center.y + mb;
P[2].x := Center.x + ma;
P[2].y := Center.y + 2 * mb * r;
P[3].x := Center.x + ma;
P[3].y := Center.y;
P[4].x := Center.x + ma;
P[4].y := Center.y - 2 * mb * r;
P[5].x := Center.x + 2 * ma * r;
P[5].y := Center.y - mb;
P[6].x := Center.x;
P[6].y := Center.y - mb;
P[7].x := Center.x - 2 * ma * r;
P[7].y := Center.y - mb;
P[8].x := Center.x - ma;
P[8].y := Center.y - 2 * mb * r;
P[9].x := Center.x - ma;
P[9].y := Center.y;
P[10].x := Center.x - ma;
P[10].y := Center.y + 2 * mb * r;
P[11].x := Center.x - 2 * ma * r;
P[11].y := Center.y + mb;
P[12].x := Center.x;
P[12].y := Center.y + mb;

旋转,旋转中心是Center, 旋转角的Cos,Sin值mCosAlpha, mSinAlpha
for i := 0 to 12 do
begin
X := P[i].x - Center.x;
Y := P[i].y - Center.y;

P[i].x := X * CosAlpha - Y * SinAlpha + Center.x;
P[i].y := X * SinAlpha + Y * CosAlpha + Center.y;
end;

画Bezier曲线
ThisDxf.DxfCanvas.PolyBezier(P);
-----拟合不出来啊,而且PolyBezier()都是integer的类型参数,怎么办???

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧