我需要在Pascal(dev-pascal)中绘制一个多边形,它的两侧有半圆形。我会给出我到目前为止提出的代码。它也有对角线。
uses crt,graph;
var a,b:smallint;
x0,y0,n,j,k,r:integer;
xevi,yoni:array[1..50] of integer;
i:real;
begin
write('n?.. ');readln(n);
detectgraph(a,b);
initgraph(a,b,'');
x0:=getmaxx div 2;
y0:=getmaxy div 2;
j:=0;
i:=0;
repeat
inc(j);
xevi[j]:=trunc( x0+200*cos(i) );
yoni[j]:=trunc( y0-200*sin(i) );
i:=i+2*pi/n;
until i>2*pi;
r:=trunc( sqrt( sqr((xevi[1]-xevi[2])) + sqr((yoni[1]-yoni[2])))) div 2;
for j:=1 to n do begin
if (xevi[j+1]-xevi[j])<>0 then begin
k:=trunc( arctan(
//abs(
((yoni[j+1]-yoni[1])/(xevi[j+1]-xevi[j])-1)
/(1+(yoni[j+1]-yoni[1])/(xevi[j+1]-xevi[j]))
//)
)*180/pi); end
else k:=90;
if k>0 then arc( (xevi[j]+xevi[j+1]) div 2, (yoni[j]+yoni[j+1]) div 2, k, k+180, r )
else begin
k:=360+k;
if k+180>360 then k:=360-k;
arc( (xevi[j]+xevi[j+1]) div 2, (yoni[j]+yoni[j+1]) div 2, k, k+180, r );
end;
end;
for j:=1 to n do
for k:=1 to n do
line( xevi[j],yoni[j],xevi[k],yoni[k]);
readln;
closegraph;
end.
如您所见,我尝试使用解析几何来找到多边形的两个相邻顶点之间的斜率,然后计算具有该斜率的线的角度,然后使用该角度绘制弧。
所以基本上,我不知道为什么它不起作用,而且我也确定有一个更简单的方法来做到这一点!任何帮助都将不胜感激!
谢谢!
答案 0 :(得分:1)
我不知道pascal所以只会使用伪代码。
x0, y0 = ... # one end of side
x1, y1 = ... # other end of side
x, y = (x0 + x1) / 2, (y0 + y1) / 2 # midpoint
angle1 = atan2(y0 - y, x0 - x) # angle from midpt back to start
angle2 = atan2(y1 - y, x1 - x) # angle from midpt forwards to end
鉴于此,对arc的调用应该是:
arc(x, y, angle1, angle2)
或
arc(x, y, angle1, angle1 + 180)
我认为您不需要针对不同的角度进行调整。
这与你的内容非常相似,只是你的atan2中有一些奇怪的+1
和-1
值,你不必担心这个角度。