Под "общим" вы подразумеваете все непараллелограммные четырехсторонние многоугольники в целом или все возможные многоугольники?
Как насчет того, чтобы нарисовать случайную линию, соединяющую 4 стороны, например. Если у вас есть это:
.BBBB.
A C
A C
.DDDD.
Затем сгенерируйте случайную точку на единичном квадрате, затем отметьте точку на линиях B и D в процентах расстояния по оси X. Сделайте то же самое с линиями A и C, используя значение по оси Y.
Затем соедините точку на линии A с линией C, а линию B с линией D, точка пересечения затем используется как случайная точка.
Он неоднороден, потому что ошибки округления помогут определенным точкам, но он должен быть близким, если вы работаете со значениями с плавающей запятой.
Реализация тоже должна быть довольно простой, так как вы уже работаете с полигонами. У вас уже должен быть код, выполняющий эти простые задачи.
Вот краткий псевдокод:
void GetRandomPoint(Polygon p, ref float x, ref float y) {
float xrand = random();
float yrand = random();
float h0 = p.Vertices[0] + xrand * p.Vertices[1];
float h1 = p.Vertices[2] + yrand * p.Vertices[3];
float v0 = p.Vertices[0] + xrand * p.Vertices[2];
float v1 = p.Vertices[1] + yrand * p.Vertices[3];
GetLineIntersection(h0, h1, v0, v1, x, y);
}
person
chakrit
schedule
27.10.2008