我有一系列父系和子系,我试图正确地重绘。
直到最近,当两个45度角开始无法正确翻译时,我的代码工作得非常好。在第一种情况下,我进行了调试,发现它需要为135,而在第二种情况下,它需要为180(由于绘制方向,不能为0)
我如何获得两条线之间的角度是
double theta1 = Math.Atan2(child.OriginalPoints.First().Y - child.OriginalPoints.Last().Y, child.OriginalPoints.First().X - child.OriginalPoints.Last().X);
double theta2 = Math.Atan2(Parent.OriginalPoints.First().Y - Parent.OriginalPoints.Last().Y, Parent.OriginalPoints.First().X - Parent.OriginalPoints.Last().X);
double diff = Math.Abs(theta1 - theta2);
diff = (diff * 180) / Math.PI;
double div = diff / roundTo;
diff = roundTo * Math.Round(div, 0);
if ((new List<double>() { 180, 360 }).Contains(Math.Abs(diff)))
{
diff = 0;
}
return diff;
然后创建表示我的线的新点我将当前角度转换为父减去prevAngle,使其正确旋转,然后使用前一行端点,当前行的长度和一些数学来获取端点。
double angle = line.AngleToParent - Math.Abs(prevAngle);
double radians = angle * Math.PI / 180;
line.EndPoint.X = (line.Length * Math.Cos(radians)) + line.StartPoint.X;
line.EndPoint.Y = (line.Length * Math.Sin(radians)) + line.StartPoint.Y;
直到上述两个角度一直在努力。第一个是45-180 = -135,下一个一个是45-135 == -90。
请告诉我,如果你能看到我的逻辑中存在的缺陷,即在不弄乱其他行的情况下正确地进行翻译。
谢谢,
答案 0 :(得分:0)
经过两天的团队和我追逐它,我们发现了它。
我们改为
double theta1 = Math.Atan2(child.OriginalPoints.First().Y - child.OriginalPoints.Last().Y, child.OriginalPoints.First().X - child.OriginalPoints.Last().X);
double theta2 = Math.Atan2(Parent.OriginalPoints.First().Y - Parent.OriginalPoints.Last().Y, Parent.OriginalPoints.First().X - Parent.OriginalPoints.Last().X);
double diff = theta1 - theta2;
diff = (diff * 180) / Math.PI;
然后添加
if (line.AngleToParent < 0)
{
line.AngleToParent += 360;
}
现在按预期绘制所有内容。即使我们改变了起始角度。希望这能节省一些时间。