C/C++の宿題を片付けます 97代目
■ このスレッドは過去ログ倉庫に格納されています
0474471
2007/10/17(水) 10:55:07#include <stdio.h>
#define NITEM(arr) (sizeof(arr)/sizeof(arr[0]))
typedef struct{int x, y;}vect2;
vect2 vect2_sub(const vect2 a, const vect2 b){
vect2 ret;
ret.x=b.x-a.x;
ret.y=b.y-a.y;
return ret;
}
int is_inside(vect2 vert[], int vert_num, vect2 p){
vect2 v1v2, v1p;
int i, j, temp, check, inside_count=0;
for(i=0;i<vert_num;i++){
for(j=0,check=0;j<3;j++){
v1v2=vect2_sub(vert[(i+j)%vert_num], vert[(i+(j+1)%3)%vert_num]);
v1p=vect2_sub(vert[(i+j)%vert_num], p);
temp=v1v2.x*v1p.y-v1v2.y*v1p.x;
if(temp>0) check++;
if(temp<0) check--;
}
if(check==3 || check==-3) inside_count+=check/3;
}
return !!(inside_count);
}
int main(int argc, char *argv[]){
vect2 vert[]={{0,0},{100,0},{0,100},{100,100}};
vect2 chk_p[]={{10,20},{20,10}};
int i;
for(i=0;i<NITEM(chk_p);i++) printf("(%d,%d) is %sside.\n", chk_p[i].x, chk_p[i].y, is_inside(vert, NITEM(vert), chk_p[i])?"in":"out");
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています