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.

ご覧のとおり、解析幾何学を使用してポリゴンの2つの隣接する頂点間の勾配を見つけ、その勾配を持つ線の角度を計算し、その角度を使用して円弧を描画しようとしました。

つまり、基本的に、なぜそれが機能しないのかわかりません。また、もっと簡単な方法があると確信しています。どんな助けでも大歓迎です!

ありがとうございました!

4

1 に答える 1

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 の呼び出しは次のいずれかになります。

arc(x, y, angle1, angle2)

また

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

さまざまな角度に調整する必要はないと思います。

これはあなたが持っているものと非常に似ていますが、atan2 にいくつかの奇妙な値+1-1値があり、角度についてあまり心配する必要はありません。

于 2012-05-26T22:40:43.283 に答える