balgomb = левая кнопка мыши
# include "graphics.h"
# include <conio.h>
#include <stdio.h>
typedef struct {
float x1,x2,x3;
} PONTH;
typedef struct {
double x,y;
}PONT;
PONTH atir(PONT A){
PONTH C;
C.x1=A.x;
C.x2=A.y;
C.x3=1;
return C;
}
PONTH metszilleszt(PONTH A,PONTH B){
PONTH C;
C.x1=(A.x2*B.x3)-(A.x3*B.x2);
C.x2=-(A.x1*B.x3)+(A.x3*B.x1);
C.x3=(A.x1*B.x2)-(A.x2*B.x1);
return C;
}
int main()
{
//PONT szakasz[4]={100,50,300,200,30,130,140,170};
PONT szakasz[6]={100,50,300,200,30,130,140,170,30,70,210,40};
int ap;
int gd,gm;
int page =0;
gd=VGA;gm=VGAMED;
initgraph(&gd,&gm,"");
PONTH A,B,C,D,E,F;
PONTH tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;
PONT pont;
for(;;){
setactivepage(page);
cleardevice();
A=atir(szakasz[0]);
B=atir(szakasz[1]);
C=atir(szakasz[2]);
D=atir(szakasz[3]);
E=atir(szakasz[4]);
F=atir(szakasz[5]);
tmp1=metszilleszt(A,B);
tmp2=metszilleszt(C,D);
tmp3=metszilleszt(E,F);
tmp4=metszilleszt(tmp2,tmp1);
tmp5=metszilleszt(tmp3,tmp1);
tmp6=metszilleszt(tmp3,tmp2);
pont.x=int (tmp3.x1/tmp3.x3);
pont.y=int (tmp3.x2/tmp3.x3);
//printf("%f %f\n",pont.x,pont.y);
// good
if((((tmp4.x2/tmp4.x3)>=szakasz[0].y) && ((tmp4.x2/tmp4.x3)<=szakasz[1].y)) &&
(((tmp4.x1/tmp4.x3)>=szakasz[0].x) && ((tmp4.x1/tmp4.x3)<=szakasz[1].x)) ||
(((tmp4.x2/tmp4.x3)>=szakasz[0].y) && ((tmp4.x2/tmp4.x3)<=szakasz[1].y)) &&
(((tmp4.x1/tmp4.x3)<=szakasz[0].x) && ((tmp4.x1/tmp4.x3)>=szakasz[1].x)))
{
setcolor(RED);
fillellipse(int (tmp4.x1/tmp4.x3),int (tmp4.x2/tmp4.x3),5,5);
}
if((((tmp5.x2/tmp5.x3)>=szakasz[0].y) && ((tmp5.x2/tmp5.x3)<=szakasz[1].y)) &&
(((tmp5.x1/tmp5.x3)>=szakasz[0].x) && ((tmp5.x1/tmp5.x3)<=szakasz[1].x)) ||
(((tmp5.x2/tmp5.x3)>=szakasz[0].y) && ((tmp5.x2/tmp5.x3)<=szakasz[1].y)) &&
(((tmp5.x1/tmp5.x3)<=szakasz[0].x) && ((tmp5.x1/tmp5.x3)>=szakasz[1].x)))
{
setcolor(RED);
//fillellipse(int (tmp5.x1/tmp5.x3),int (tmp5.x2/tmp5.x3),5,5);
fillellipse(int (tmp5.x1/tmp5.x3),int (tmp5.x2/tmp5.x3),5,5);
}
if((((tmp6.x2/tmp6.x3)>=szakasz[0].y) && ((tmp6.x2/tmp6.x3)<=szakasz[1].y)) &&
(((tmp6.x1/tmp6.x3)>=szakasz[0].x) && ((tmp6.x1/tmp6.x3)<=szakasz[1].x)) ||
(((tmp6.x2/tmp6.x3)>=szakasz[0].y) && ((tmp6.x2/tmp6.x3)<=szakasz[1].y)) &&
(((tmp6.x1/tmp6.x3)<=szakasz[0].x) && ((tmp6.x1/tmp6.x3)>=szakasz[1].x)))
{
setcolor(RED);
fillellipse(int (tmp6.x1/tmp6.x3),int (tmp6.x2/tmp6.x3),5,5);
}
//else{ setcolor(RED);
// fillellipse(int (tmp3.x1/tmp3.x3),int (tmp3.x2/tmp3.x3),5,5); }
/* Egerkezeles */
if (!balgomb) ap = getactivepoint((pont2d*)szakasz,6,6);
if (ap >= 0 && balgomb)
{
szakasz[ap].x = egerx;
szakasz[ap].y = egery;
}
/* Egerkezeles vege */
setcolor(WHITE);
line((int)szakasz[0].x,(int)szakasz[0].y,(int)szakasz[1].x,(int)szakasz[1].y);
rectangle((int)szakasz[0].x,(int)szakasz[0].y, (int)szakasz[0].x+4, (int)szakasz[0].y+4);
rectangle((int)szakasz[1].x,(int)szakasz[1].y, (int)szakasz[1].x+4, (int)szakasz[1].y+4);
line((int)szakasz[2].x,(int)szakasz[2].y,(int)szakasz[3].x,(int)szakasz[3].y);
rectangle((int)szakasz[2].x,(int)szakasz[2].y, (int)szakasz[2].x+4, (int)szakasz[2].y+4);
rectangle((int)szakasz[3].x,(int)szakasz[3].y, (int)szakasz[3].x+4, (int)szakasz[3].y+4);
line((int)szakasz[4].x,(int)szakasz[4].y,(int)szakasz[5].x,(int)szakasz[5].y);
rectangle((int)szakasz[4].x,(int)szakasz[4].y, (int)szakasz[4].x+4, (int)szakasz[4].y+4);
rectangle((int)szakasz[5].x,(int)szakasz[5].y, (int)szakasz[5].x+4, (int)szakasz[5].y+4);
setvisualpage(page);
page = 1-page;
if (kbhit()) break;
}
getch();
closegraph();
return(0);
}