C# 矩阵(?)到矩形,反之亦然

C# 矩阵(?)到矩形,反之亦然,c#,geometry,drawing,C#,Geometry,Drawing,我目前正在处理以我不熟悉的方式定义矩形的文件。有人告诉我这可能是一个矩阵,但知道这并不能特别帮助我解决我的问题,将它转换为点和回 例如,我有以下值: 0.95、-0.28、-0.28、-0.95250.0234172.1973、-589.0131604.8696 这8个浮点数组成一个具有以下坐标的矩形,中心为0: {X=-778,Y=838} {X=-303,Y=698} {X=-399,Y=372} {X=-874,Y=512} 为了获得这些要点,我使用了其他人编写的用于这些文件的以下函数

我目前正在处理以我不熟悉的方式定义矩形的文件。有人告诉我这可能是一个矩阵,但知道这并不能特别帮助我解决我的问题,将它转换为点和回

例如,我有以下值:

0.95、-0.28、-0.28、-0.95250.0234172.1973、-589.0131604.8696

这8个浮点数组成一个具有以下坐标的矩形,中心为0:

{X=-778,Y=838}
{X=-303,Y=698}
{X=-399,Y=372}
{X=-874,Y=512}

为了获得这些要点,我使用了其他人编写的用于这些文件的以下函数:

static Point[] GetPoints(double d01, double d02, double d03, double d04, double l01, double l02, double p01, double p02)
{
    var points = new Point[4];

    double a00 = d01 * l01;
    double a01 = d02 * l01;
    double a02 = d03 * l02;
    double a03 = d04 * l02;

    double sx1 = p01 - a00 - a02; if (sx1 < p01) sx1 = Math.Ceiling(sx1);
    double sy1 = p02 - a01 - a03; if (sy1 < p02) sy1 = Math.Ceiling(sy1);
    double sx2 = p01 + a00 - a02; if (sx2 < p01) sx2 = Math.Ceiling(sx2);
    double sy2 = p02 + a01 - a03; if (sy2 < p02) sy2 = Math.Ceiling(sy2);
    double sx3 = p01 + a00 + a02; if (sx3 < p01) sx3 = Math.Ceiling(sx3);
    double sy3 = p02 + a01 + a03; if (sy3 < p02) sy3 = Math.Ceiling(sy3);
    double sx4 = p01 - a00 + a02; if (sx4 < p01) sx4 = Math.Ceiling(sx4);
    double sy4 = p02 - a01 + a03; if (sy4 < p02) sy4 = Math.Ceiling(sy4);

    if (a02 * a01 > a03 * a00)
    {
        points[0] = new Point((int)sx1, (int)sy1);
        points[1] = new Point((int)sx2, (int)sy2);
        points[2] = new Point((int)sx3, (int)sy3);
        points[3] = new Point((int)sx4, (int)sy4);
    }
    else
    {
        points[0] = new Point((int)sx1, (int)sy1);
        points[3] = new Point((int)sx2, (int)sy2);
        points[2] = new Point((int)sx3, (int)sy3);
        points[1] = new Point((int)sx4, (int)sy4);
    }

    return points;
}
静态点[]获取点(双d01、双d02、双d03、双d04、双l01、双l02、双p01、双p02)
{
var点=新点[4];
双a00=d01*l01;
双a01=d02*l01;
双a02=d03*l02;
双a03=d04*l02;
双sx1=p01-a00-a02;如果(sx1a03*a00)
{
点[0]=新点((int)sx1,(int)sy1);
点[1]=新点((int)sx2,(int)sy2);
点[2]=新点((int)sx3,(int)sy3);
点[3]=新点((int)sx4,(int)sy4);
}
其他的
{
点[0]=新点((int)sx1,(int)sy1);
点[3]=新点((int)sx2,(int)sy2);
点[2]=新点((int)sx3,(int)sy3);
点[1]=新点((int)sx4,(int)sy4);
}
返回点;
}
我现在要寻找的可能是一个解释,这些数字是什么,这是我可以读到的常见的还是自定义的,以及一种将点转换回8个浮点值的方法


有人能帮我吗?在不知道这是什么的情况下,很难找到任何东西:/

p01和p02是中心坐标(CenterX和CenterY)
d01-d04表示旋转角度的余弦和正弦(或单位长度方向向量的dx、dy分量)
l01和l02是初始轴对齐矩形的半宽半高。
sxi和syi是第i个垂直的X和Y坐标。
这些坐标向中心坐标舍入。
最后,顶点按一定顺序计算-顺时针或逆时针(我没有选中)

要从vertice集合重建初始参数:
可以将中心点确定为两个相对顶点的中间

p01 = (points[0].X + points[2].X) / 2
p02 = (points[0].Y + points[2].Y) / 2
和旋转角度

Angle=atan2(点[1].Y-点[0].Y,点[1].X-点[0].X)

然后通过+-Pi/2或+-Pi将角度校正为最小的幅值(例如,
3/4*Pi=>Pi/4
) 注意,初始参数设置角度可能相差+-Pi/2
发现
d01=Cos(角度)等

注意,角度可能与初始参数设置相差+-Pi/2或+-Pi

l01 = Abs((points[1].X - points[0].X) * 0.5 / Cos(Angle))
l02 = Abs((points[2].Y - points[1].Y) * 0.5 / Cos(Angle))

请注意,由于角度值不明确,l01和l02可能会互换。

p01和p02是中心坐标(CenterX和CenterY)
d01-d04表示旋转角度的余弦和正弦(或单位长度方向向量的dx、dy分量)
l01和l02是初始轴对齐矩形的半宽半高。
sxi和syi是第i个垂直的X和Y坐标。
这些坐标向中心坐标舍入。
最后,顶点按一定顺序计算-顺时针或逆时针(我没有选中)

要从vertice集合重建初始参数:
可以将中心点确定为两个相对顶点的中间

p01 = (points[0].X + points[2].X) / 2
p02 = (points[0].Y + points[2].Y) / 2
和旋转角度

Angle=atan2(点[1].Y-点[0].Y,点[1].X-点[0].X)

然后通过+-Pi/2或+-Pi将角度校正为最小的幅值(例如,
3/4*Pi=>Pi/4
) 注意,初始参数设置角度可能相差+-Pi/2
发现
d01=Cos(角度)等

注意,角度可能与初始参数设置相差+-Pi/2或+-Pi

l01 = Abs((points[1].X - points[0].X) * 0.5 / Cos(Angle))
l02 = Abs((points[2].Y - points[1].Y) * 0.5 / Cos(Angle))

请注意,由于角度值不明确,l01和l02可能会互换。

p01和p02是中心坐标(CenterX和CenterY)
d01-d04表示旋转角度的余弦和正弦(或单位长度方向向量的dx、dy分量)
l01和l02是初始轴对齐矩形的半宽半高。
sxi和syi是第i个垂直的X和Y坐标。
这些坐标向中心坐标舍入。
最后,顶点按一定顺序计算-顺时针或逆时针(我没有选中)

要从vertice集合重建初始参数:
可以将中心点确定为两个相对顶点的中间

p01 = (points[0].X + points[2].X) / 2
p02 = (points[0].Y + points[2].Y) / 2
和旋转角度

Angle=atan2(点[1].Y-点[0].Y,点[1].X-点[0].X)

然后通过+-Pi/2或+-Pi将角度校正为最小的幅值(例如,
3/4*Pi=>Pi/4
) 注意,初始参数设置角度可能相差+-Pi/2
发现
d01=Cos(角度)等

注意,角度可能与初始参数设置相差+-Pi/2或+-Pi

l01 = Abs((points[1].X - points[0].X) * 0.5 / Cos(Angle))
l02 = Abs((points[2].Y - points[1].Y) * 0.5 / Cos(Angle))

请注意,由于角度值不明确,l01和l02可能会互换。

p01和p02是中心坐标(CenterX和CenterY)
d01-d04表示旋转角度的余弦和正弦(或单位长度方向向量的dx、dy分量)
l01和l02是初始轴对齐矩形的半宽半高。
sxi和syi是第i个垂直的X和Y坐标。
这些坐标向分方向四舍五入