我正在寻找一个数学公式,在绘制Y作为X的函数的图形上,在指定的起始点(X的值,甚至更好的X和Y坐标)之前将具有一定的斜率然后,它将绘制一个指定半径的弧,当它到达第二个指定的斜率时将结束,并且从该点开始将是该第二个斜率的另一条直线。
我知道因为它的Y是X的函数,所以斜率参数需要大于-90且小于90度;我并不担心在这些极端情况下(或超出)的任何不当行为。
实际上,我会更喜欢一个采用起点和终点(2d坐标)以及开始和结束斜率的公式;并且它们之间会有两个弧线(需要时在它们之间有一条直线),无缝地连接两条直线(显然,终点的X需要大于起点的X;我不要关心当情况不是这样时会发生什么。但我想这样的公式可能比我先问的要难得多。
ps:by" arc"我指的是一个圆圈;如图所示,如果图形的两个轴具有相同的比例,则弧对于相同半径的圆将具有正确的纵横比。
答案 0 :(得分:0)
嗯,我觉得这样:
计算P0
作为行A + t*dA
和B - t*dB
计算P1
(圆心)
它是由半径A->P0
垂直的平移线B->P0
和r
的交点。有两种可能性,所以选择正确的一种(这会导致圆形部分的角度减小)。
计算P2,P3
只是行A-P0
和B-P0
之间的交叉点以及从P1
到它的垂直线
曲线
// some constants first
da=P2-A;
db=B-P3;
a2=atan2(P2.x-P1.x,P2.y-P1.y);
a3=atan2(P3.x-P1.x,P3.y-P1.y);
if (a2>a3) a3-=M_PI*2.0;
dang=a3-a2;
// now (x,y)=curve(t) ... where t = <0,3>
if (t<=1.0)
{
x=A.x+t*da.x;
y=A.y+t*da.y;
}
else if (t<=2.0)
{
t=a2+((t-1.0)*dang);
x=P1.x+r*cos(t);
y=P1.y+r*sin(t);
}
else
{
t=t-2.0;
x=P3.x+t*db.x;
y=P3.y+t*db.y;
}