Я хотел бы создать случайные точки внутри треугольника на основе точек (0, 0) (0, 1), (1, 0.5). Я полагаю, что самый простой способ сделать это - сгенерировать точки в квадрате (0, 0), (0, 1), (1, 1), (1, 0) с помощью numpy, а затем отфильтровать их по этому треугольнику.

Вот код, который будет генерировать точки внутри этого квадрата.

pts = np.random.rand(1000, 2)

Однако я не уверен, как отфильтровать массив numpy только до точек внутри этого треугольника.

0
Dan Grahn 29 Мар 2021 в 22:53

2 ответа

Лучший ответ

Если вы хотите применить подход к фильтрации, вам нужно найти условие, чтобы проверить, какие точки находятся внутри треугольника. Затем вы можете использовать функцию numpys argwhere, чтобы найти индексы всех точек, которые соответствуют вашему условию:

pts = np.random.rand(1000, 2)
x_coord = pts[:, 0]
y_coord = pts[:, 1]


def _in_triangle(x, y):
# You might want to doublecheck if this condition is correct, I am sure there is a better way.
    return (((x <= 0.5) & (y <= 2*x)) | ((x <= 0.5) & (y <= 2-2*x))) & (0 <= x) & (x <= 1) & (0 <= y) & (y <= 1)


points_in_triangle = pts[np.argwhere(_in_triangle(x_coord, y_coord))]
2
Mangochutney 29 Мар 2021 в 21:30

Я собираюсь попробовать многосторонний ответ на неразрешенные непредвиденные обстоятельства:

Если вам не нужно равномерное распределение, просто сгенерируйте x-координату равномерно из [0, 1], затем сгенерируйте y-координату из [0.5 - ((1-x) / 2), 0.5 + ((1 -x) / 2)] (да, вы можете упростить эти выражения). Это делает каждую координату x одинаково вероятной и, следовательно, отдает предпочтение точкам с меньшим количеством соответствующих координат y: точки около вершины вашего треугольника будут выбираться чаще, чем точки около основания.

Вы можете исправить это с помощью обратного преобразования вашей координаты x: square x перед тем, как выбрать y.


Если вам нужно использовать уже сгенерированные вами точки, у вас нет другого выбора, кроме как отфильтровать их каким-либо образом. Половина из них будет неподходящей, так как эти точки будут случайным образом распределены по вашему массиву. Невозможно разрезать массив для достижения такого результата.

ИЗМЕНИТЬ КРЕДИТ Скотту Хантеру

Однако вы можете отфильтровать и преобразовать неподходящие точки: сопоставьте их с помощью простого преобразования снаружи треугольника внутрь. Ваш треугольник ограничен сверху линиями

y = 2x
y = -2x + 2

Простое отображение должно отражать каждую точку над этими линиями через середину отрезка линии: либо (0,25, 0,5), либо (0,75, 0,5). Это простое уравнение: для отражения точки (x, y) относительно точки (a, b) отражение равно (2a-x, 2b-y).

1
Prune 29 Мар 2021 в 23:36