从3个点检索正角度或负角度

本文关键字:3个 点检索 | 更新日期: 2023-09-27 18:21:35

我在2D空间中围绕中心点旋转点。这些点是中心点、旧鼠标位置和新鼠标位置。我的旋转函数运行良好,我可以完美地计算角度。但我想计算一个负角度,如果用户在一个应该被解释为逆时针的方向上移动鼠标。

例如,如果您在中心点的y值之上(小于),则向右移动鼠标(正x轴)应顺时针旋转,但如果您实际在中心点y值之下(大于),则应逆时针旋转。

这是我的:

PointF centerPoint;
PointF oldPoint;
PointF newPoint;
double Xc = centerPoint.X;
double Yc = centerPoint.Y;
double Xb = oldPoint.X;
double Yb = oldPoint.Y;
double Xa = newPoint.X;
double Ya = newPoint.Y;
double c2 = (Math.Pow(Xb - Xa, 2) + Math.Pow(Yb - Ya, 2));
double a2 = (Math.Pow(Xb - Xc, 2) + Math.Pow(Yb - Yc, 2));
double b2 = (Math.Pow(Xa - Xc, 2) + Math.Pow(Ya - Yc, 2));
double a = Math.Sqrt(a2);
double b = Math.Sqrt(b2);
double val = (a2 + b2 - c2) / (2 * a * b);
double angle = Math.Acos(val);

所以我需要一种方法,在需要的时候使角度为负,这样点就可以顺时针或逆时针旋转,以跟随鼠标的位置。

从3个点检索正角度或负角度

试试这个,但我不确定:

double v1x = Xb - Xc;
double v1y = Yb - Yc;
double v2x = Xa - Xc;
double v2y = Ya - Yc;
double angle = Math.Atan2(v1x, v1y) - Math.Atan2(v2x, v2y);
private double AngleFrom3PointsInDegrees(double x1, double y1, double x2, double y2, double x3, double y3)
{
    double a = x2 - x1;
    double b = y2 - y1;
    double c = x3 - x2;
    double d = y3 - y2;
    double atanA = Math.Atan2(a, b);
    double atanB = Math.Atan2(c, d);
    return (atanA - atanB) * (-180 / Math.PI); 
    // if Second line is counterclockwise from 1st line angle is 
    // positive, else negative
}

似乎你所需要做的就是

angle = angle > Math.PI ? angle - 2*Math.PI : angle;

在代码的末尾。这将使您顺时针旋转到centerPoint和oldPoint定义的线的右侧,逆时针旋转到线的左侧,无论方向如何。

给定向量(x1,y1)和(x2,y2),我建议计算叉积和点积,然后对它们使用Ata2()。这将适用于所有情况,其中两个向量都是非零的,并且向量长度是"合理的"。