2012-05-26 38 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程序中有一個錯誤。 –