c - C中直线的图形交集

标签 c intersection bgi

我有作业。

作业是:有 3 行,它们的末尾是方 block 。 首先 该程序必须查看一个圆圈,即线条相互切割。 (换句话说:取 3 条线的交点)。 其次,程序必须沿线更改背景。每条线的两侧用一种颜色定义背景。以及如何旋转线条,连同它们一起改变背景颜色。 有 3 行,和 6 种背景颜色。背景颜色的边框是沿线的。

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

Youtube video about the exercise/homework

我试过实现线的交点,但效果不是很好。 而且我不知道,我怎样才能实现彩色背景变化。

需要什么样的知识?

如果有人可以向我建议一些:算法、网页、教程、源代码,任何可以帮助我的东西。或者我的作业的英文名称是什么(谷歌搜索) 因为我不认为,我的解决方案是准备作业的最佳方式(也许不会成功)

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

sourcode in english

  • PONT = 点,点
  • PONTH = 点的聚合
  • atir = 重写
  • metszilleszt = 交点拟合
  • szakasz = section, phase...(英语-匈牙利语中有太多)或 platoon :-D
  • eger = 鼠标
  • 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);
    }
    

最佳答案

关于线的交点,你应该去看看Loren博客上Matworks的Loren Shure和Lucio Cetto的文章:

在 Matlab 中,但原理是相同的。

关于c - C中直线的图形交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715109/

相关文章:

c - 在 GCC 编译器上使用 C 查找因子

条件宏扩展

c - mq_unlink 将 errno 设置为 EEXIST

c++ - 函数与直线的交点

c++ - 为什么不在 C++ 图形中打开绘图窗口?

c - 如何在 C/C++ 中暂停循环

c - 如何在 Mac 终端上将数组输入到 C 程序中?

algorithm - 精确检查两个具有双坐标的矩形是否相交

python - 根据其他数据帧中的列标题成员资格(按日期)在 pandas 数据帧(按日期)中设置 boolean 值

c - Linux Graphics C 程序出现以下错误如何解决?