그래서, 만들어본 삼각형 내부에 있는 점 판정하기 소스

C로 만들어 보았다. 아는게 C밖에 없으니…-_-;

#define TRUE 1

#define FALSE 0

typedef struct {

double x;

double y;

} point;

typedef struct {

double a;

double b;

double c;

} line;

typedef struct {

point t1;

point t2;

point t3;

} triangle;

line lineDeclaration(point p,point q){

line l;

l.a=q.y-p.y;

l.b=p.x-q.x;

l.c=p.y*q.x-p.x*q.y;

return l;

}

double lineSubstitution(point p, line l){

return l.a*p.x+l.b*p.y+l.c;

}

double lineMultiplication(point p, point q, line l){

return lineSubstitution(p, l)*lineSubstitution(q,l);

}

point mediumPoint(point p, point q){

point r={(p.x-q.x)/2.0,(p.y-q.y)/2.0};

return r;

}

int triangleInteriorPoints(point p, triangle t){

point side[3];

side[0].x=t.t1.x;

side[0].y=t.t1.y;

side[1].x=t.t2.x;

side[1].y=t.t2.y;

side[2].x=t.t3.x;

side[2].y=t.t3.y;

int i=2;

int justify=0;

line l;

line m;

while(i){

l=lineDeclaration(side[i%3],side[(i+1)%3]);

m=lineDeclaration(side[(i+1)%3],side[(i+2)%3]);

if(

lineMultiplication(p, mediumPoint(side[(i+2)%3],side[i]), l)>0 &&

lineMultiplication(p, mediumPoint(side[(i+2)%3],side[i]), m)>0){

justify++;

}

i–;

}

if(justify==3){

return TRUE;

}

else{

return FALSE;

}

}

이건 헤더 파일이다. 테스트용 코드는 다음과 같다.

#include

#include

#include”triangle.h”

#include

#include

int main(int argc, char* argv[]){

if(argc==1){

printf(“ERROR. There are no inputs.\n Usage : %s file1 file2\n file1 includes triangle data\n file2 includes points data\n”, argv[0]);

exit(1);

}

FILE *TRIDATA;

FILE *POINTDATA;

if(!(TRIDATA=fopen(argv[1], “rt”))){

printf(“ERROR. %s does not exists.\n”,argv[1]);

exit(1);

}

if(!(POINTDATA=fopen(argv[2],”rt”))){

printf(“ERROR. %s does not exists.\n”,argv[2]);

exit(1);

}

char buf1[200];

char **buffer1;

char buf2[200];

char **buffer2;

int i=0;

while(!feof(TRIDATA) && !feof(POINTDATA)){

fgets(buf1,200, TRIDATA);

fgets(buf2,200,POINTDATA);

buffer1=g_strsplit(buf1, “,”, 6);

triangle tri;

tri.t1.x=atof(buffer1[0]);

tri.t1.y=atof(buffer1[1]);

tri.t2.x=atof(buffer1[2]);

tri.t2.y=atof(buffer1[3]);

tri.t3.x=atof(buffer1[4]);

tri.t3.y=atof(buffer1[5]);

buffer2=g_strsplit(buf2, “,”,2);

point po;

po.x=atof(buffer2[0]);

po.y=atof(buffer2[1]);

printf(“%d,%d\n”,triangleInteriorPoints(po, tri),i++);

g_strfreev(buffer1);

g_strfreev(buffer2);

}

return 1;

}

그리고 컴파일 명령어는 다음과 같다.

gcc `pkg-config –cflags –libs glib-2.0` -o triangle triangle.c

glib2가 있어야 컴파일 된다는 점에 주의하여야 한다.

사용법은 다음과 같다.

Usage : ./triangle file1 file2

file1 includes triangle data

file2 includes points data

triangle data는 콤마(,)로 구분된 6개의 실수가 들어가고, points data는 콤마로 구분된 2개의 실수가 들어간다.

코멘트

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.