получается ли точка внутри треугольника
От: Nfnehtdbx2  
Дата: 28.12.13 17:13
Оценка:
y=x*(y1+y2)/(x1+x2)
x=y*(x1+x2)/(y1+y2)

Пересечение вертикальной или горизонтальной прямой отрезка
(если добавить косинус или синус возможно походу и не горизонтального и вертикального, а под углом)

если обе точки над вашей или под вашей (правее и левее для у) то точка не входит
если выше и ниже или правее, левее то входит
точки задаются в виде a,b,c,d,e,f
потом сортируются x3>x2>x2 и y3>y2>y1
import java.lang.*;
import java.util.*;
import java.math.*;
public class Program {
    
    
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long x1=0;
        long x2=0;
        long x3=0;
        long x=0;
        long yp1=0;
        long yp2=0;
        long xp1=0;
        long xp2=0;
        long y2=0;
        long y3=0;
        long y1=0;
        long ind1=0;
        long sx1=0;
        long sx2=0;
        long sx3=0;
        long sy2=0;
        long sy3=0;
        long sy1=0;
        long y=0;
        
        long a=0;
        long b=0;
        long c=0;
        long d=0;
        long e=0;
        long f=0;
        
        //сортировка координат по x          
        if((a<=b)&&(b<=c)){x1=a; x2=b; x3=c; y1=d; y2=e; y3=f;}
        if((a<=c)&&(c<=b)){x1=a; x2=c; x3=b; y1=d; y2=f; y3=e;}
        if((b<=a)&&(a<=c)){x1=b; x2=a; x3=c; y1=e; y2=d; y3=f;}
        if((c<=a)&&(a<=b)){x1=c; x2=a; x3=b; y1=f; y2=d; y3=e;}
        if((b<=c)&&(c<=a)){x1=b; x2=c; x3=a; y1=e; y2=f; y3=d;}
        if((c<=b)&&(b<=a)){x1=c; x2=b; x3=a; y1=f; y2=e; y3=d;}
        
        
        
        //Сортировка координат по y
        if((d<=e)&&(e<=f)){sy1=d; sy2=e; sy3=f; sx1=a; sx2=b; sx3=c;}
        if((f<=e)&&(e<=d)){sy1=f; sy2=e; sy3=d; sx1=c; sx2=b; sx3=a;}
        if((e<=d)&&(d<=f)){sy1=e; sy2=d; sy3=f; sx1=b; sx2=a; sx3=c;}
        if((f<=d)&&(d<=e)){sy1=f; sy2=d; sy3=e; sx1=c; sx2=a; sx3=b;}
        if((e<=f)&&(f<=d)){sy1=e; sy2=f; sy3=d; sx1=b; sx2=c; sx3=a;}
        if((d<=f)&&(f<=e)){sy1=f; sy2=e; sy3=d; sx1=a; sx2=c; sx3=b;}
        
        
        
        
    
        
        
        
ind1=0;    //это число будет равно 1 если точка входит и 0 если она не входит    
//Проверка по x    
if((x1!=x2)&&(x1!=x3)&&(x3!=x2)){if(   ((y1==y2)&&(y1==y3))==false       ){
    
if(x>x1){if(x<(x2)){
    yp1=x*(y1+y2)/(x1+x2); yp2=x*(y1+y3)/(x1+x3);
    
    if(((yp1>y1)&&(yp2<y2))||((yp1<y1)&&(yp2>y2))){ind1=1;}
            
        }}
  
if(x<x3){if(x>x2){
               yp1=x*(y+y2)/(x1+x2); yp2=x*(y1+y3)/(x1+x3);
               
            if(((yp1>y1)&&(yp2<y2))||((yp1<y1)&&(yp2>y2))){ind1=1;}
                    
                }}
             
    
}}else{


//Проверка по y    
if((sy1!=sy2)&&(sy1!=y3)&&(sy3!=sy2)){    if(   ((sx1==sx2)&&(sx1==sx3))==false       ){    
if(y>sy1){if(y<(sy2)){
    xp1=y*(sx1+sx2)/(sy1+sy2); xp2=y*(sx1+sx3)/(sy1+sy3);
    
    if(((xp1>sx1)&&(xp2<sx2))||((xp1<sx1)&&(xp2>sx2))){ind1=1;}
            
        }}
  
if(y<sy3){if(y>sy2){
               xp1=y*(x+sx2)/(sy1+sy2); xp2=x*(sx1+sx3)/(sy1+sy3);
               
            if(((xp1>sx1)&&(xp2<sx2))||((xp1<sx1)&&(xp2>sx2))){ind1=1;}
                    
                }}
        
 
}}}//обре проверки завершились


//если треугольник прямоугольный(4 варианта прямоугольных треугольников)
if(   ( ((sx1==sx2)&&(sx2==sx3)) || ((sy1==sy2)&&(sy2==sy3)) )== false   ){
    
 if(  ((sx1==sx2)&&(sy1==sy2))||((sx2==sx3)&&(sy2==sy3))||((sx1==sx2)&&(sy2==sy3))||((sx2==sx3)&&(sy1==sy2))  )
{    
    
    if((y>sy1)&&(y<sy3)){
        
    
         xp1=y*(x+sx2)/(sy1+sy2); xp2=x*(sx1+sx3)/(sy1+sy3);
         
    if(((x>xp1)&&(x<xp2))||((x<xp1)&&(x>xp2))){ind1=1;}
    
    }}}


   System.out.println(ind1);
   
    }}
Re: получается ли точка внутри треугольника
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 28.12.13 17:24
Оценка:


Для исходников есть соответствующие коды форматирования. Функция на сто строк с двумя десятками переменных красноречиво названными yp1 и sx3 это, мягко говоря, дурной тон. При том, что это задача на десять строк — максимум.
Ce n'est que pour vous dire ce que je vous dis.
Re: получается ли точка внутри треугольника
От: batu Украина  
Дата: 28.12.13 17:54
Оценка:
Здравствуйте, Nfnehtdbx2, Вы писали:

точка лежит слева или справа от прямой определяется знаком если подставить координаты точки в уравнение прямой. Так подставь координаты, проверь знаки и пранализируй их.
Re: получается ли точка внутри треугольника
От: Stanislav V. Zudin Россия  
Дата: 28.12.13 18:00
Оценка: +1
Здравствуйте, Nfnehtdbx2, Вы писали:

Определить, находится ли точка внутри треугольника очень просто.

Способ первый.
Треугольник ABC, точка D.
Будем считать направление обхода вершин треугольника против часовой стрелки.
Тогда достаточно проверить, что точка находится левее каждой стороны треугольника.
Чтобы определить взаимное положение линии и точки надо посчитать векторное произведение между двумя векторами.
В нашем случае: AB x AD, BC x BD и CA x CD.
Векторное произведение это два умножения и одно вычитание.

Никаких синусов/косинусов, не зависит от положения и типа треугольника.


Способ второй, универсальный.
Работает для любых полигонов.
Классический алгоритм.
Пускаем луч из точки, считаем пересечения с ребрами полигона. Четное число пересечений — точка снаружи, нечетное — внутри.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: получается ли точка внутри треугольника
От: batu Украина  
Дата: 28.12.13 18:19
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Nfnehtdbx2, Вы писали:


SVZ>Определить, находится ли точка внутри треугольника очень просто.


SVZ>Способ первый.

SVZ>Треугольник ABC, точка D.
SVZ>Будем считать направление обхода вершин треугольника против часовой стрелки.
SVZ>Тогда достаточно проверить, что точка находится левее каждой стороны треугольника.
Во.. Я нечто такое имел в виду.. Только левее или правее каждой стороны
Re: получается ли точка внутри треугольника
От: TarasB  
Дата: 30.12.13 07:05
Оценка: 6 (1)
Здравствуйте, Nfnehtdbx2, Вы писали:

N> // TODO Auto-generated method stub

N> //сортировка координат по x
N> //Сортировка координат по y
N>//это число будет равно 1 если точка входит и 0 если она не входит
N>//Проверка по x
N>//Проверка по y
N>//обре проверки завершились
N>//если треугольник прямоугольный(4 варианта прямоугольных треугольников)

OH MY DOG!!!
Вот до чего доводит незнание простейших операций над векторами и их геометрического смысла.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.