2016-06-12 104 views
2

我有一个创建曲线的点。然后我创建另一个两个数组:左,右,这应该是我的中间曲线的边界(它们由+/- x'es只修改了),就像这样:围绕另一个点和X轴的旋转点

enter image description here

在结束我想有这样的事情:

enter image description here

我试图做的是通过旋转左,围绕中心点右键点(由红色线),但它不为我工作很好。

static Point Rotate(Point p, Point o, double theta) 
    { 
     Point rotated = new Point(); 
     double x = Math.Cos(theta) * (p.X - o.X) - Math.Sin(theta) * (p.Y - o.Y) + o.X; 
     rotated.X = (int)Math.Round(x); 
     double y = Math.Sin(theta) * (p.X - o.X) + Math.Cos(theta) * (p.Y - o.Y) + o.Y; 
     rotated.Y = (int)Math.Round(y); 
     return rotated; 
    } 

余数从红线点之间的角度。

float xDiff = finalList[finalList.IndexOf(row) + 1][0].x - point.toPoint().X; 
float yDiff = finalList[finalList.IndexOf(row) + 1][0].y - point.toPoint().Y; 
angle = Math.Atan2(yDiff, xDiff) * 180.0/Math.PI; 
angle = Math.Abs(angle) - 90d; 

结果: enter image description here

如何获取左,右点阵列正确?也许有另一种方法来绘制可定制的边界曲线?我需要这个绘制图表。任何帮助将不胜感激:)

编辑:我得到的角度似乎没问题,在线的底部约10度,然后提高到50左右,再次减少,所以我认为问题是在旋转本身。

+0

它看起来像你试图执行翻译而不是旋转? 否则,如果您可以更改分层和线条宽度,则可以将黑线的宽度设置为红线的两倍,然后在同一点上绘制黑线和红线。这样红色两边就会有一点黑色。 –

+0

我不能这样做,例如,红线的颜色可以设置为半透明。 – user3716478

回答

2

我已经完成了这个。 我已经创建了一个围绕3d线的管。

我使用的方法是:

对待每个点(红线)作为从当前点到下一个点的向量。黑线上的点垂直于此矢量。 (见下图)这样你就可以在黑线上生成点。不涉及轮换。

我已经添加了一张图片,以显示我的解决方案。箭头是当前点和下一点的初始矢量。箭头显示生成的平行向量。 蓝色箭头是红色箭头上的垂直向量。垂直向量的长度可以用来缩小'平行'线。

Shows the points as vectors and how to generate a parallel line

为了计算垂直矢量,使用cross product


对于我的解决方案,我目前的一个/下的Vector3D计算2D circlepoints在垂直平面(因此他们成为3D)。对每个点重复该操作,并以相同角度将圆点连接到其他圆点和创建的面。圆的半径用于使管变得更宽或更窄。

+0

这非常有帮助!我会尽力实现这一点。 – user3716478

+0

作品完美无缺,感谢您的快速解决方案! – user3716478

+0

欢迎你,祝你好运... –