矩阵 (?) 到矩形,反之亦然
Matrix (?) to Rectangle and vise versa
我目前正在处理以我不熟悉的方式定义矩形形状的文件。有人告诉我它可能是一个矩阵,但知道这并不能特别帮助我解决我的问题,将它转换为点并返回。
例如,我有这些值:
0.95, -0.28, -0.28, -0.95, 250.0234, 172.1973, -589.0131, 604.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;
}
我现在正在寻找的可能是这些数字到底是什么的解释,这是我可以阅读的常见事物还是自定义的,以及将点转换回 8 个浮点值的方法.
有人可以帮我解决这个问题吗?不知道这是什么,真的很难找到任何东西:/
p01和p02为中心坐标(CenterX和CenterY)
d01-d04分别表示旋转角度的余弦和正弦(或单位长度方向向量的dx,dy分量)
l01和l02是初始轴对齐矩形的半宽和半高。
sxi 和 syi 是第 i 个顶点的 X 和 Y 坐标。
这些坐标向中心坐标四舍五入。
最后,顶点按一定顺序编号 - 顺时针或逆时针(我没有检查)
从顶点集重建初始参数:
您可以将中心点确定为两个相对顶点的中间
p01 = (points[0].X + points[2].X) / 2
p02 = (points[0].Y + points[2].Y) / 2
和旋转角度
Angle = atan2(points[1].Y - points[0].Y, points[1].X - points[0].X)
然后通过+-Pi/2或+-Pi将Angle修正为最小量级值(例如,3/4*Pi=> Pi/4
)
请注意,初始参数设置角度可能会因 +-Pi/2
而异
寻找
d01 = Cos(Angle) etc
请注意,角度可能与初始参数集相差 +-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可能因角度值不明确而互换
我目前正在处理以我不熟悉的方式定义矩形形状的文件。有人告诉我它可能是一个矩阵,但知道这并不能特别帮助我解决我的问题,将它转换为点并返回。
例如,我有这些值:
0.95, -0.28, -0.28, -0.95, 250.0234, 172.1973, -589.0131, 604.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;
}
我现在正在寻找的可能是这些数字到底是什么的解释,这是我可以阅读的常见事物还是自定义的,以及将点转换回 8 个浮点值的方法.
有人可以帮我解决这个问题吗?不知道这是什么,真的很难找到任何东西:/
p01和p02为中心坐标(CenterX和CenterY)
d01-d04分别表示旋转角度的余弦和正弦(或单位长度方向向量的dx,dy分量)
l01和l02是初始轴对齐矩形的半宽和半高。
sxi 和 syi 是第 i 个顶点的 X 和 Y 坐标。
这些坐标向中心坐标四舍五入。
最后,顶点按一定顺序编号 - 顺时针或逆时针(我没有检查)
从顶点集重建初始参数:
您可以将中心点确定为两个相对顶点的中间
p01 = (points[0].X + points[2].X) / 2
p02 = (points[0].Y + points[2].Y) / 2
和旋转角度
Angle = atan2(points[1].Y - points[0].Y, points[1].X - points[0].X)
然后通过+-Pi/2或+-Pi将Angle修正为最小量级值(例如,3/4*Pi=> Pi/4
)
请注意,初始参数设置角度可能会因 +-Pi/2
而异
寻找
d01 = Cos(Angle) etc
请注意,角度可能与初始参数集相差 +-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可能因角度值不明确而互换