2013-07-12 6 views
3

У меня есть (x,y) -координаты всех трех углов двумерного треугольника. Теперь я хочу, чтобы проверить, если точка с (xp,yp) находится внутри этого треугольника: Я знаю два способа (только теоретически, но не реализовано), чтобы проверить:различные способы расчета треугольника

  • с векторами:

    vec_0A + vec_AB*lambda + vec_AC*my = vec_0P 
    
    lambda + my =< 1 
    
  • с уравнения линий:

вычислить три линейных уравнения AB, AC, BC и проверить каждое уравнение, если P слева/справа от него.

Задача 1: Она должна быть точной, так как типичные (x,y) -значения моих углов и точек выглядеть следующим образом: (-0.049721957725789148, 0.024809768773549616) -> 18 позиций после десятичной точки

Проблема 2: Он должен имеет хорошую производительность , потому что я хочу проверить, находится ли P внутри треугольника (ABC) ИЛИ внутри треугольника (DEF) ИЛИ внутри треугольника (GHI) ИЛИ внутри треугольника (JKL) ИЛИ вне всех из них. И я должен сделать это с ~ 10 000 очков.

Я где-то читал, что векторный путь не так точен. Правда? Знаете ли вы какие-то другие способы проверки? Какой способ проверки вы рекомендуете?

+0

Не вижу проблем с векторным подходом. Точность будет зависеть от вашего оборудования. У этого [сообщения] (http://stackoverflow.com/questions/2049582/how-to-determine-a-point-in-a-triangle) есть дополнительная информация. – dwxw

+0

Похоже, что это может быть полезно: http://www.blackpawn.com/texts/pointinpoly/ – user2357112

+0

Оба способа действительны, и в них нет ничего по своей сути неточно. Первый способ - быть немного быстрее, imho. Я не знаю, как часто вам приходится проверять эти 10 тыс. Очков, но это не должно занять слишком много времени. Что касается точности: '' float '' '' '' '' '' '' '' '' '' ', ', которая дает вам точность ~ 16 десятичных цифр. Если вам нужно больше, всегда есть ['decimal'] (http://docs.python.org/2/library/decimal.html) (хотя это будет медленнее). – Carsten

ответ

3

С такими проблемами всегда ищут библиотеки ... это математическая проблема и, вероятно, имеет решение в библиотеке. Один быстрый ответ:

import matplotlib 
matplotlib.path.Path.contains_points # is the function you are looking for 

ознакомьтесь с инструкцией по использованию документации docstring.

Смежные вопросы