2012-05-26 207 views
0

我需要绘制一个在边上有半圆的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. 

正如你可以看到,我试图使用解析几何找到多边形的两个相邻顶点之间的斜率,然后计算与该斜率的线的角度,然后使用角度来绘制圆弧。

所以基本上,我不知道为什么它不起作用,我也确信有一个更简单的方法来做到这一点!任何帮助都将不胜感激!

谢谢!

回答

1

我不知道帕斯卡,所以只会使用伪代码。

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(x, y, angle1, angle2) 

arc(x, y, angle1, angle1 + 180) 

,我认为你不应该需要调整不同的角度。

这与您所拥有的非常相似,只是您的atan2中有一些奇怪的+1-1值,并且您不必太担心角度。

+0

谢谢!奇怪的正面和负面的价值在那里,因为由于某种原因,当我得到一个消极的角度,或超过360度的角度,这是不正确的解释。我仍然无法使它工作 - devpascal没有arctan2函数。不过,我做了一个有效的工作!再次感谢! – krvolok

+0

啊,对不起,没有意识到atan2失踪了。这很关键,很难做到。如果你需要额外的+/- 1和角度检查,我怀疑你的atan2程序中有一个错误。 –