我有一组构成2D多边形的位置顶点。
Vector2[] _chassisConcaveVertices =
{
new Vector2(5.122f, 0.572f),
new Vector2(3.518f, 0.572f),
new Vector2(3.458f, 0.169f),
new Vector2(2.553f, 0.169f),
new Vector2(2.013f, 0.414f),
new Vector2(0.992f, 0.769f),
new Vector2(0.992f, 1.363f),
new Vector2(5.122f, 1.363f),
};
我可以使用什么算法来修改位置,以便翻转结果多边形?我需要水平和垂直翻转多边形。
答案 0 :(得分:4)
假设Vector2
类有两个属性/成员名称x
和y
:
public Vector2[] FlipHorizontally(Vector2[] original)
{
Vector2[] flipped = new Vector2[original.Length];
for (int i = 0; i < original.Length; i++)
{
flipped[i] = new Vector2(-1 * original[i].x, original[i].y);
}
return flipped;
}
public Vector2[] FlipVertically(Vector2[] original)
{
Vector2[] flipped = new Vector2[original.Length];
for (int i = 0; i < original.Length; i++)
{
flipped[i] = new Vector2(original[i].x, -1 * original[i].y);
}
return flipped;
}
这将相对于两个轴翻转顶点。您没有指定新多边形相对于原始多边形的位置。如果您需要“移动”它,则只需向所有x
添加一个值,为所有y
添加另一个值。
答案 1 :(得分:1)
如果你在点(0.0f,0.0f)附近翻转,你只需要否定这些值。所以你的形状将是:
Vector2[] _chassisConcaveVertices =
{
new Vector2(-5.122f, -0.572f),
new Vector2(-3.518f, -0.572f),
new Vector2(-3.458f, -0.169f),
new Vector2(-2.553f, -0.169f),
new Vector2(-2.013f, -0.414f),
new Vector2(-0.992f, -0.769f),
new Vector2(-0.992f, -1.363f),
new Vector2(-5.122f, -1.363f),
};
如果你在一个点(x,y)周围翻转,那么x值和(y - (py - y)的每个点都是(x - (px - x))或(2 * xp.x) )或(2 * yp.y)表示y值。
这解释了:
。是你要翻转的点
*是你要翻转的点
O是你想要的结果
x axis
^
|
. -
| | <-
| | <- Let this be distance a
* -
| | <-
| | <- This should be equal to a
O -
|
|
-------> y axis
让我们说x的值。 *和O分别为t,m和b(顶部,中部和底部)。如您所见,距离a = t-m,b = m-a。因此,b = m-(t-m)= m-t + m = m * 2-t
然后你可以使用这个原理编写一个算法来翻转不同点周围的所有点,这将为你提供翻转的多边形!
答案 2 :(得分:0)
不确定是否有“正确”的方法,但是类似下面的内容应该可以在水平和垂直方向上翻转多边形。
未经测试的例子:
Vector2[] _chassisConcaveVertices =
{
new Vector2(5.122f, 0.572f),
new Vector2(3.518f, 0.572f),
new Vector2(3.458f, 0.169f),
new Vector2(2.553f, 0.169f),
new Vector2(2.013f, 0.414f),
new Vector2(0.992f, 0.769f),
new Vector2(0.992f, 1.363f),
new Vector2(5.122f, 1.363f),
};
// find center
float sumX = 0;
float sumY = 0;
foreach (var vector in _chassisConcaveVertices)
{
sumX += vector.X;
sumY += vector.Y;
}
Vector2 center = new Vector2(
sumX / _chassisConcaveVertices.Length,
sumY / _chassisConcaveVertices.Length);
// create a new version of the polygon flipped
Vector2[] flipped = _chassisConcaveVertices
.Select(v => new Vector2(
v.X + (center.X - v.X) * 2,
v.Y + (center.Y - v.Y) * 2))
.ToArray();
答案 3 :(得分:0)
首先你必须取圆角的中心来刻划多边形,然后沿着垂直和水平线穿过中心,对于每个点,首先,在垂直线的另一侧取对称,然后在horitzontal的另一侧重复对称点的动作,你将全部翻转。
见到你!
答案 4 :(得分:0)
水平翻转的测试示例。 支持对撞机中的多个路径: 这些路径是相对于对撞机中心位置镜像的。
void FlipHorizontally(PolygonCollider2D tpolygon)
{
// find centre X
float sumX = 0;
foreach (Vector2 v2 in tpolygon.points)
sumX += v2.x;
float centreX = sumX / tpolygon.points.Length;
// Flip each path in the polygon
for (int k = 0; k < tpolygon.pathCount; k++)
{
List<Vector2> mirrored = new List<Vector2>();
List<Vector2> pathPoints = new List<Vector2>(tpolygon.GetPath(k));
for (int i = 0; i < pathPoints.Count; i++)
{
Vector2 v2 = pathPoints[i];
float xx = v2.x - 2 * (v2.x - centreX);
mirrored.Add(new Vector2(xx, v2.y));
}
tpolygon.SetPath(k, mirrored);
}
Debug.Log("flipped paths: " + tpolygon.pathCount);
}