Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public static int check3_mod(Point a, Point b, Point middle)
{
long ax = a.x - middle.x;
long ay = a.y - middle.y;
long bx = b.x - middle.x;
long by = b.y - middle.y;
if (ay < 0 ^ by < 0)
{
int s = Long.signum(ax * by - ay * bx);
if (by < 0)
return s;
return -s;
}
if ((ay == 0 || by == 0) && ax * bx <= 0 && (ax * by - ay * bx) == 0)
return 0;
return 1;
} public static int check7(Point a, Point b, Point middle)
{
if( ( a.y > middle.y ) ^ ( b.y <= middle.y ) )
return 1;
long ax = a.x - middle.x;
long ay = a.y - middle.y;
long bx = b.x - middle.x;
long by = b.y - middle.y;
int s = Long.signum(ax * by - ay * bx);
if (s == 0)
{
if (ax * bx <= 0)
return 0;
return 1;
}
if (ay < 0)
return -s;
if (by < 0)
return s;
return 1;
}ax=-1,ay=-1,bx=0,by=0. public static int check8(Point a,Point b,Point middle) {
int ax = middle.x-a.x;
int ay = middle.y-a.y;
int bx = middle.x-b.x;
int by = middle.y-b.y;
if((ay|by)==0) return (((ax^bx)|((-ax)^(-bx)))>>31)+1;
if((ay^by)>=0) return 1;
long m=(long)ax*by-(long)ay*bx;
return m==0 ? 0 : (((int)(m>>32)^by)>>30)|1;
}
public static int check8a(Point a,Point b,Point middle) {
int ax = a.x-middle.x;
int ay = a.y-middle.y;
int bx = b.x-middle.x;
int by = b.y-middle.y;
if((ax|ay)==0 || (bx|by)==0) return 0;
if((ay|by)==0) return ((ax^bx)>>31)+1;
if((ay^by)>=0) return 1;
long m=(long)ax*by-(long)ay*bx;
return m==0 ? 0 : (((int)(m>>32)^by)>>30)|1;
}
public static int check8(Point a,Point b,Point middle) {
int ax = a.x-middle.x;
int ay = a.y-middle.y;
int bx = b.x-middle.x;
int by = b.y-middle.y;
if((ax|ay)==0 || (bx|by)==0) return 0;
if((ay|by)==0) return ((ax^bx)>>31)+1;
if(ay>=0) {
if(by>=0) return 1;
long m=(long)ax*by-(long)ay*bx;
return (int)(m>>63)|(int)((ulong)(-m)>>63);
} else {
if(by<0) return 1;
long m=(long)ay*bx-(long)ax*by;
return (int)(m>>63)|(int)((ulong)(-m)>>63);
}
}
public static int check8(Point a,Point b,Point middle) {
int ax = a.x-middle.x;
int ay = a.y-middle.y;
int bx = b.x-middle.x;
int by = b.y-middle.y;
if((ax|ay)==0 || (bx|by)==0) return 0;
if((ay|by)==0) return ((ax^bx)>>31)+1;
if((ay^by)>=0) return 1;
long m=(long)ax*by-(long)ay*bx;
return (((int)(m>>32)^ay)>>31)-(((int)((-m)>>32)^ay)>>31);
}
public static int check9(Point a,Point b,Point middle) {
int ax = a.x-middle.x;
int ay = a.y-middle.y;
int bx = b.x-middle.x;
int by = b.y-middle.y;
if((ay^by)>=0) {
if((ax|ay)==0 || (bx|by)==0) return 0;
if((ay|by)!=0) return 1;
return ((ax^bx)>>31)+1;
}
long m=(long)ax*by-(long)ay*bx;
return (int)((m^ay)>>63)-(int)(((-m)^ay)>>63);
}
return (((int)(m>>32)^ay)>>31)-(((int)((-m)>>32)^ay)>>31);
Проверка принадлежности точки невыпуклому многоугольнику