我处于一种情况,我有一个点Vector3(x,y,z),我需要从那个起点生成一个3D(一个环)的圆圈,从该点开始并以它结束。现在我可以生成一个vector3的圆圈,但我不知道如何使用一个点生成它。 例如,主要点是红色,其他点是黑色点:
答案 0 :(得分:1)
要定义圆形,无论是在2D还是3D空间中,您需要在圆上放置三个独立的点。
否则,有无数(数学无限)的可能性。
如果你只有一个点,它位于圆圈(顶部,底部,......)的位置?圆的半径是多少?鉴于它是一个3D空间,它的倾向是什么?你无法从单个(x,y,z,)点推导出它。
编辑我在Paint中进行了一个小的可视化。请注意,这是一个2D平面,但同样适用于3D空间(三个点只需要共面,根据定义,任意三个点都是)
编辑2
这类问题可能更好地询问几何或游戏开发(因为我怀疑你正在做的事情)相关的StackExchange网站,因为这个问题实际上是一个几何问题,而不是编码问题。
编辑3
我不打算为你编写代码,因为“请写我的代码”不是StackOverflow的意图。
但是,有一些在线资源可以帮助进行圆圈的代数化处理,你只需要把它放在代码中。
根据this earlier answer on SO,您可以在this reference page上找到与圈子相关的公式的非常详细的说明。寻找“3点(2维)圆的方程式”。
编辑4,最终修改
正如您所问,可以根据两个点定义一个圆圈,如果其中一个点是圆圈的中心点。
然后可以根据这两个点之间的距离计算圆的半径
从那时起,如果您有中心点和圆半径,则可以计算圆上的任何点。请参阅我上面提到的相同参考链接,因为此页面包含许多从不同数据发送中派生圈子的方法。
编辑5,这次真的是最后的编辑:)
This StackOverflow answer解释了您希望在代码中执行的操作。它假设您知道中心点和半径,您可以如上所述得到它 我希望这是足够的信息来帮助你进一步:)
答案 1 :(得分:0)
下面是一个如何计算给定中心向量和半径的圆点的示例。
这适用于平面,但您可以使用其他旋转矩阵旋转它们。
class Program
{
static void Main(string[] args)
{
int n = 22; //the number of points
float radius = 22f;
Vector3 vector = new Vector3(radius, 0, 0); //the vector you keep rotating
Vector3 center = new Vector3(33,33,33); //center of the circle
float angle = (float)Math.PI * 2 / (float)n;
Vector3[] points = new Vector3[n];
Matrix rotation = Matrix.RotationZ(angle);
for (int i = 0; i < n; i++)
{
points[i] = vector + center;
vector.TransformNormal(rotation);
}
}
}
我为项目使用了托管的directX框架......不确定你使用的是什么
修改强>
关于轮换和翻译问题的示意图:
答案 2 :(得分:0)
使用GeoDesy和NetTopologySuite的C#。
static Geometry Circle(double lat, double lon, double meters)
{
GeodeticCalculator geoCalc = new GeodeticCalculator(Ellipsoid.WGS84);
GlobalCoordinates start = new GlobalCoordinates(new Angle(lat), new Angle(lon));
int sides = 4;
int degree_unit = 360 / sides;
var c = new List<NetTopologySuite.Geometries.Coordinate>();
for (int i = 0; i < sides; i++)
{
GlobalCoordinates dest = geoCalc.CalculateEndingGlobalCoordinates(start, new Angle(degree_unit * i), meters);
c.Add(new NetTopologySuite.Geometries.Coordinate(dest.Longitude.Degrees, dest.Latitude.Degrees));
}
c.Add(c[0]);
GeometryFactory gc = new GeometryFactory(new PrecisionModel(), 4326);
var box = gc.CreatePolygon(c.ToArray());
var mbc = new MinimumBoundingCircle(box);
return mbc.GetCircle();
}