gpt4 book ai didi

c# - 由等长元素包围的随机空间的算法

转载 作者:太空狗 更新时间:2023-10-29 19:47:33 25 4
gpt4 key购买 nike

我是一名建筑系学生,试图在 Grasshopper for Rhino 中使用 C# 解决空间问题。

我想创造的空间是机场的展览空间。该空间将由相似长度的元素组成。这个想法是用铰链连接它们,从而允许它们根据使用的元素数量创建不同布局和大小的空间。

illustration

正如您从插图中看到的那样,我希望空间以距离起点一个元素长度的开口结束。

我的第一次尝试是根据所需的线段(墙)数量创建等边三角形。简而言之,从起点开始创建三角形,然后将形成外边界的三角形边添加到点列表中。这个点列表返回到 Grasshopper 应用程序,它在点之间画线。有一点是我从上一个三角形的边 AC 或 BC 随机创建了下一个三角形。

这是创建的空间示例(12 - 8 - 14 - 20 个元素):

various generated shapes

这是创建这些点列表的源代码:

private void RunScript(double radius, int walls, ref object A)
{

//
List<Point3d> pointList = new List<Point3d>();
List<Point3d> lastList = new List<Point3d>();

bool alternate = true;
bool swapped = false;
Random turn = new Random();

// set up the first part of the triangle
Point3d point1 = new Point3d(0, 0, 0);
Point3d point2 = new Point3d(0, radius, 0);
pointList.Add(point1);
pointList.Add(point2);
Point3d calcPoint;

for(int i = 0; i < walls - 1; i++) // walls - 1, is because I need one less triangle to get to the amount of walls
{
// use the method to create two similar circles and return the intersection point
// in order to create an equilateral triangle
calcPoint = FindCircleIntersections(point1.X, point1.Y, point2.X, point2.Y, radius, alternate);

// random generator: will decide if the new triangle should be created from side BC or AC
bool rotate = turn.Next(2) != 0;
Print("\n" + rotate);

// set the 2nd and 3rd point as 1st and 2nd - depending on random generator.
if(rotate)
{
point1 = point2;
if(swapped == true)
swapped = false;
else
swapped = true;
}

// if the direction is swapped, the next point created will not be a part of the outer border
if(swapped)
lastList.Add(calcPoint);
else
pointList.Add(calcPoint);

point2 = calcPoint;

// swap direction of intersection
if(rotate)
{
if(alternate)
alternate = false;
else
alternate = true;
}

}

lastList.Reverse();

foreach (Point3d value in lastList)
{
pointList.Add(value);
}

A = pointList;

}



// Find the points where the two circles intersect.
private Point3d FindCircleIntersections(
double cx0, double cy0, double cx1, double cy1, double rad, bool alternate)
{
// Find the distance between the centers.
double dx = cx0 - cx1;
double dy = cy0 - cy1;
double dist = Math.Sqrt(dx * dx + dy * dy);


// Find a and h.
double a = (rad * rad - rad * rad + dist * dist) / (2 * dist);
double h = Math.Sqrt(rad * rad - a * a);

// Find P2.
double cx2 = cx0 + a * (cx1 - cx0) / dist;
double cy2 = cy0 + a * (cy1 - cy0) / dist;

// Get the points P3.
if(alternate)
return new Point3d((double) (cx2 + h * (cy1 - cy0) / dist), (double) (cy2 - h * (cx1 - cx0) / dist), 0);
else
return new Point3d((double) (cx2 - h * (cy1 - cy0) / dist), (double) (cy2 + h * (cx1 - cx0) / dist), 0);
}

我想做的是改变这些形状的创作方式,使它们不仅是走廊,而且像我最初的草图。我想要一个算法来输入段(数量和长度),然后提出可以用这个段数创建的不同空间布局。我想由于曲面分割,空间必须用三角形、正方形或六边形创建?你认为我应该研究这个“最大面积”算法吗:Covering an arbitrary area with circles of equal radius here on stackoverflow

对于此算法的任何帮助,我将不胜感激。干杯,埃里克

最佳答案

如果您只对生成要进行外部评估的实例(而不是所有此类实例)的程序感兴趣,则可以“膨胀”您的曲线。例如,在你的第二张图片的 14 段实例中,有一个地方曲线向内并向后翻倍——所以你的点列表有一个点重复。对于这样的曲线,您可以切掉两个(相同的)点(A 和 B)以及周围点之一(A 或 B)之间的所有内容,并且您已经回收了一些点以扩展您的曲线 - 可能导致非走廊结构。不过,您可能需要使用一些魔法来确保它是一条“闭合”曲线,交替向曲线的前部和后部添加段。

另一个机会:如果您可以识别曲线的内部(并且有这方面的算法),那么在两条线段相对于您的曲线形成凹角的任何地方,您都可以将其吹掉以形成非走廊区域。例如。上面 14 段曲线的第二段和第三段可能会向左膨胀。

将这两种方法连续应用于类似走廊的曲线应该会生成您正在寻找的许多形状。祝你好运!

关于c# - 由等长元素包围的随机空间的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4417068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com