Опитвам се да създам пръстен от кръгове, ала:
Кръговете имат даден радиус, circleRadius
. Пръстенът има максимален радиус, maxRingRadius
. Броят на кръговете може да бъде всяко цяло число, circles
, което трябва да се изчисли, заедно с действителния радиус на пръстена, ringRadius
. Кръговете, когато центровете им са разположени на ringRadius
единици от центъра на пръстена, трябва да се докосват точно, както е на диаграмата.
При дадени circleRadius
и maxRingRadius
, как може да се намери най-близкото (или следващото най-малко) ringRadius
, което ще пасне на цяло число circles
, и след това да позиционира тези кръгове?
static Vector3[] RingOfCircles(float maxRingRadius, float circleRadius) {
//int circles = ...; // calculate this?
//float ringRadius = ...; // calculate this?
//Edit: Solution. These three lines are adapted from InBetween's GetNextSmallerRingRadius function but Unity3d-ized and without validation
int circles = Mathf.RoundToInt(Mathf.PI / Mathf.Asin(circleRadius / maxRingRadius));
float centralAngle = 2 * Mathf.PI / (numberOfCircles - 1);
float ringRadius = circleRadius / Mathf.Sin(centralAngle / 2);
// create ring of center points
float radsPerCircle = (Mathf.PI * 2) / circles;
Vector3[] centerPoints = new Vector3[circles];
for (int i=0; i < circles; i++) {
float angle = i * radsPerCircle;
centerPoints[i] = new Vector3(
Mathf.Sin(angle) * ringRadius,
Mathf.Cos(angle) * ringRadius,
0);
}
return centerPoints;
}
`
Забележка: maxRingRadius
може също така да бъде minRingRadius
или approximateRingRadius
за моите цели. Но ringRadius
трябва да дефинира следващия най-близък „пръстен“, който може да съдържа цял брой кръгове.
Решено: Визуално потвърждение на решението