C中线的图形交叉

时间:2011-10-10 15:27:13

标签: c graphics intersection

我有一份作业。

作业是:有3行,他们以正方形结束。 首先程序必须查看圆圈是否相互切割线条。 (换句话说:取3条线的交点)。 其次,程序必须改变背景,沿线。每条线的两侧用颜色定义背景。如何旋转线条,以及它们,背景颜色的变化。 有3行,6种背景色。背景颜色的边界是沿着这条线。

编程环境是DevC ++(我们必须使用c ++控制台应用程序,但是在课程中我们不用c ++编写,只是c ...)

Youtube video about the exercise/homework

我已经尝试过实现这些线的交叉点,但是效果并不好。 我不知道,如何实现丰富多彩的背景变化。

需要什么样的知识?

我想如果有人可以向我推荐一些:算法,网页,教程,sourecode,什么可以帮助我。或者我的英文作业名称是什么(谷歌搜索) 因为我不认为,我的解决方案是准备我的作业的最佳方式(也许它不会成功)

这里是我迄今为止所做的代码(但它并不完美。线条的交叉并不完美。这不是一个漂亮的解决方案,抱歉我不是专业的C程序员):

sourcode in english

  • PONT = point,dot
  • PONTH =积分
  • atir = rewrite
  • metszilleszt =交叉点拟合
  • szakasz =部分,阶段......(英语 - 匈牙利语中有太多)或排:-D
  • eger = mouse
  • egérkezelés=鼠标控制
  • 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);
    }
    

1 个答案:

答案 0 :(得分:0)

关于线条的交叉点,你应该阅读Loren博客上Matworks的Loren Shure和Lucio Cetto的文章:

这是在Matlab中,但原则是相同的。