Графическое пересечение линий в C - PullRequest
1 голос
/ 10 октября 2011

У меня есть домашнее задание.

Домашнее задание: Есть 3 строки, заканчивающиеся квадратами. Во-первых Программа должна видеть круг, если линии обрезают друг друга.(Другой способ: возьмите пересечение 3 линий). Во-вторых , программа должна изменить фон, вдоль линий.Обе стороны каждой линии определяют цвет фона.И как вращаются линии, вместе с ними меняется цвет фона.Есть 3 линии и 6 цветов фона.Граница цвета фона проходит вдоль линий.

Среда программирования - это DevC ++ (мы должны использовать консольное приложение c ++, но на уроке мы не кодируем на c ++, просто c...)

Youtube видео об упражнении / домашнем задании

Я пробовал реализовать пересечение линий, но это не очень хорошо работает.И я не имею ни малейшего представления, как я могу реализовать изменение цветного фона.

Какие знания нужны для этого?

Я хотел бы, чтобы кто-нибудь мог предложить мне что-то: алгоритм, веб-страницу, учебное пособие, sourecode, что-нибудь, что может мне помочь.Или как называется моя домашняя работа на английском языке (для поиска в Google) Потому что я не думаю, что мое решение - лучший способ подготовить мою домашнюю работу (может быть, это не удастся)

Вот код,что я делал до сих пор (но это не идеально. Пересечение линий не идеально. Это не красивое решение, извините, я не опытный программист C):

sourcode на английском

  • PONT = точка, точка
  • PONTH = агрегирование точек
  • atir = перезапись
  • 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 голосов
/ 10 октября 2011

Что касается пересечения линий, вам следует прочитать статью Лорен Шуре и Люсио Четто из Matworks в блоге Лорен:

Это в Matlab, но принципы те же.

...