C 中线的图形交点

发布于 2024-12-09 11:19:14 字数 4713 浏览 0 评论 0 原文

我有作业。

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

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

有关练习/作业的 Youtube 视频

我尝试过实现线相交,但效果不太好 出色地。 我不知道,如何实现彩色背景变化。

它需要什么样的知识?

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

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

英文酸代码

  • PONT =观点,点
  • PONTH = 点聚合
  • atir = 重写
  • metszilleszt = 交叉点拟合
  • szakasz = 截面、阶段...(英语-匈牙利语中有太多)或排 :-D
  • eger = 鼠标
  • egérkezelés = 鼠标控制
  • balgomb = 左鼠标按钮

    # 包含“graphics.h”
    # 包含 ;
    #include ;
    类型定义结构{
            浮点数 x1,x2,x3;
    } 庞特;
    
    类型定义结构{
            双 x,y;
    }庞特;
    
    PONTH atir(PONT A){
          庞特C;
          C.x1=Ax;
          C.x2=Ay;
          C.x3=1;
    返回C;
    }
    
    PONTH metszilleszt(PONTH A,PONTH B){
          庞特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);
       返回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;
    整数gd,gm;
    int页=0;
    gd=VGA;gm=VGAMED;
    initgraph(&gd,&gm,"");
    庞特A、B、C、D、E、F;
    PONTH tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;
    PONT 蓬;
    
    为了(;;){
     设置活动页面(页面);
     清除设备();
    
     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);
    
    
    // 好的
     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)))
       {
        设置颜色(红色);
        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)))
       {
        设置颜色(红色);
        //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)))
       {
        设置颜色(红色);
        fillellipse(int (tmp6.x1/tmp6.x3),int (tmp6.x2/tmp6.x3),5,5); 
       }
    
       //其他{ 设置颜色(红色);
      // fillellipse(int (tmp3.x1/tmp3.x3),int (tmp3.x2/tmp3.x3),5,5); }
    
     /* 埃格克泽勒斯 */
      if (!balgomb) ap = getactivepoint((pont2d*)szakasz,6,6);
       if (ap >= 0 && balgomb)
       {
        szakasz[ap].x = egerx;
        szakasz[ap].y = 埃格里;
       }
     /* Egerkezeles vege */
     设置颜色(白色);
      line((int)szakasz[0].x,(int)szakasz[0].y,(int)szakasz[1].x,(int)szakasz[1].y);
      矩形((int)szakasz[0].x,(int)szakasz[0].y,(int)szakasz[0].x+4,(int)szakasz[0].y+4);
      矩形((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);
      矩形((int)szakasz[2].x,(int)szakasz[2].y,(int)szakasz[2].x+4,(int)szakasz[2].y+4);
      矩形((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);
      矩形((int)szakasz[4].x,(int)szakasz[4].y,(int)szakasz[4].x+4,(int)szakasz[4].y+4);
      矩形((int)szakasz[5].x,(int)szakasz[5].y,(int)szakasz[5].x+4,(int)szakasz[5].y+4);
    
     设置视觉页面(页面);
     页 = 1 页;
     if (kbhit()) 中断;
    }
     getch();
     关闭图();
     返回(0);
    }
    

I have a homework.

The homework is: There are 3 lines, theirs end with squares. Firstly The program has to view a circle is the lines are cut each other. (In other way: Take the intersection of the 3 lines). Secondly, the program has to change the background, along the lines. Each line's both side define the background with a colour. And how rotating the lines, together with them, the background colour changing.
There are 3 lines, and 6 background colour. The border of background color is along the lines.

The programming enviroment is the DevC++ (we must use the c++ console applicaton, but in the lesson we not coding in c++, just c...)

Youtube video about the exercise/homework

I've tried implement of the lines' intersection, but It doesn't work very well.
And I don't have any idea, how can I implement of the colourful background change.

What kind of knowledge is needed for it?

I would like to if somebody can suggest to me some: algorithm, webpage, tutorial, sourecode, anything what can help me. Or what is the name of my homework in english ( to google search)
Cause I don't think, my solution is the best way to prepare my homework (maybe it won't succes)

Here the code, that I have did up to now (but it not perfect. The intersection of lines is not perfectly. It's not a beautiful solution, sorry I am not an expert C programmer):

sourcode in english

  • PONT = point, dot
  • PONTH = aggregation of points
  • atir = rewrite
  • metszilleszt = fitting of intersection
  • szakasz = section, phase... (there is too many in english-hungarian) or platoon :-D
  • eger = mouse
  • egérkezelés = mouse control
  • balgomb = left button of mouse

    # 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);
    }
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海里的那抹蓝 2024-12-16 11:19:14

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

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

Regarding the intersections of lines, you should read the article of Loren Shure and Lucio Cetto from Matworks on Loren's blog:

It's in Matlab but the principles are the same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文