Graph 绘制边上有半圆的多边形

Graph 绘制边上有半圆的多边形,graph,polygon,pascal,Graph,Polygon,Pascal,我需要用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:=getm

我需要用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.
使用crt、图形;
变量a,b:smallint;
x0,y0,n,j,k,r:整数;
xevi,yoni:整数的数组[1..50];
i:真实的;
开始
写('n?);readln(n);
检测图(a,b);
初始图(a,b,);
x0:=getmaxx第2部分;
y0:=getmaxy div 2;
j:=0;
i:=0;
重复
公司(j);
xevi[j]:=trunc(x0+200*cos(i));
yoni[j]:=trunc(y0-200*sin(i));
i:=i+2*pi/n;
直到i>2*pi;
r:=trunc(sqrt(sqr((xevi[1]-xevi[2]))+sqr((yoni[1]-yoni[2]))div 2;
对于j:=1到n,开始
如果(xevi[j+1]-xevi[j])0,则开始
k:=trunc(arctan(
//腹肌(
((yoni[j+1]-yoni[1])/(xevi[j+1]-xevi[j])-1)
/(1+(yoni[j+1]-yoni[1])/(xevi[j+1]-xevi[j]))
//)
)*180/pi);结束
否则k:=90;
如果k>0,则弧((xevi[j]+xevi[j+1])第2部分,(yoni[j]+yoni[j+1])第2部分,k,k+180,r)
否则开始
k:=360+k;
如果k+180>360,则k:=360-k;
弧((xevi[j]+xevi[j+1])第2部分,(yoni[j]+yoni[j+1])第2部分,k,k+180,r);
结束;
结束;
对于j:=1到n do
对于k:=1到n do
线(xevi[j],yoni[j],xevi[k],yoni[k]);
readln;
闭合图;
结束。
如您所见,我尝试使用解析几何找到多边形两个相邻顶点之间的坡度,然后计算具有该坡度的直线的角度,然后使用该角度绘制圆弧

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


谢谢大家!

我不懂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)

我认为你不需要调整不同的角度


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

谢谢!奇怪的正负值都存在,因为由于某种原因,当我得到一个负角度,或者一个超过360度的角度时,它没有被正确解释。我仍然很难让它工作-devpascal没有arctan2函数。不过,我做了一个有效的!再次感谢!啊,对不起,我不知道atan2不见了。这很关键,很难做到正确。如果您需要额外的+/-1和角度检查,我怀疑您的atan2例程中存在错误。
arc(x, y, angle1, angle1 + 180)