Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
#1

Графическое изображение геометрических фигур на координатной плоскости - C++

29.04.2013, 00:02. Просмотров 1651. Ответов 2
Метки нет (Все метки)

заданием была озобразить графически лабу, которую уже делали до этого без граф функций
само задание:
// Выбрать три такие разные точки заданного на плоскости множества точек,
// которые составляют треугольник наибольшего периметра.

раотаю в дев с++

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "conio.h"
#include "stdlib.h"
#include "math.h"
#include "graphics.h"
#define z 13
#define e -10
#define g 20
#define E 4
 
#define p -9
#define q 20
 
using namespace std;
 
int main(int argc, char *argv[])
{
int osy,osx,xt,yt,mx,my;
int i,n,t1,t2,t3;
//float x[E],y[E],perim;
int x[E],y[E],perim;
char s[50];
printf("\n koordinaty tochek \n-------------------------\n");
initwindow(600,600);
setbkcolor(15);
cleardevice();
setcolor(5);
my=(getmaxy()/20);
mx=(getmaxx()/20);
setlinestyle(0,1,3);
osy=getmaxy();
osx=getmaxx();
line(osx/2+p,0,osx/2+p,osy);//÷åðòèì îñü îðäèГ*Г*ГІ
line(0,osy/2+q,osx,osx/2+q);// îñü Г*áñöèññ
setlinestyle(1,1,1);
for(i=-10;i<11;i++)
{
setcolor(z);
xt=mx*(i+10);
line(xt,0,xt,osy);//âåðòèêГ*ëüГ*ûå ëèГ*ГЁГЁ
sprintf(s,"%d",i);
setcolor(0);
outtextxy(xt,osy/2+24,s);
}
for(i=-10;i<11;i++)
{
setcolor(z);
yt=my*(i+10);
line(0,yt,osx,yt);//ãîðèçîГ*ГІГ*ëüГ*ûå ëèГ*ГЁГЁ
sprintf(s,"%d",i);
setcolor(0);
outtextxy(osx/2-25,osy-yt,s);
}
n=E;
for(int i=0; i<n; i++)
    {
        //x[i]=(float)rand()/RAND_MAX*(g-e)+e;
        //y[i]=(float)rand()/RAND_MAX*(g-e)+e;
        x[i]=e+rand()%g;
        y[i]=e+rand()%g;
    }
printf(" #\tX\tY\n-------------------------\n");
for(int i=0; i<n; i++)
    {
        //printf("%2d : (%8.3f, %8.3f)\n", i+1,x[i],y[i]);
        printf("%2d : (%4d, %4d)\n", i+1,x[i],y[i]);
    }
t1=-1;t2=-1;t3=-1;perim=0;
if (n<3)
{
        printf("nedostatochno tochek dlya postroenia treugol'nika...");
        getch();
        return 0;
}
setcolor(0);
setlinestyle(0,1,3);
int count=0,i1,i2,i3;
//float r1,r2,r3;
int r1,r2,r3;
/*for(i1=0; i1<n-2; i1++)
{
        for(i2=i1+1; i2<n-1; i2++)
        {
            for(i3=i2+1; i3<n; i3++)
            {
                         printf("i1=%d   i2=%d    i3=%d\n",i1,i2,i3)
                    r1=sqrt((x[i2]-x[i1])*(x[i2]-x[i1])+(y[i2]-y[i1])*(y[i2]-y[i1]));
                    r2=sqrt((x[i2]-x[i3])*(x[i2]-x[i3])+(y[i2]-y[i3])*(y[i2]-y[i3]));
                    r3=sqrt((x[i3]-x[i1])*(x[i3]-x[i1])+(y[i3]-y[i1])*(y[i3]-y[i1]));
                x[i1]=x[i1]*mx+getmaxx()/2-8;
                x[i2]=x[i2]*mx+getmaxx()/2-8;
                x[i3]=x[i3]*mx+getmaxx()/2-8;
                y[i1]=y[i1]+getmaxy()/2+20-y[i1]*my;
                y[i2]=y[i2]+getmaxy()/2+20-y[i2]*my;
                y[i3]=y[i3]+getmaxy()/2+20-y[i3]*my;
                circle(x[i1],y[i1],1);circle(x[i2],y[i2],1);circle(x[i3],y[i3],1);
                
                    
                            //printf("treugol'nik obrazyut tochki %d, %d, %d : perimetr - %8.3f\n", i1+1, i2+1, i3+1, r1+r2+r3);
                            count++;
                            if(r1+r2+r3>perim)
                            {
                                t1=i1; t2=i2; t3=i3; perim=r1+r2+r3;
                            }
            }
        } 
}*/
for(i1=0; i1<n-2; i1++)
    for(i2=i1+1; i2<n-1; i2++)
        for(i3=i2+1; i3<n; i3++)
            {  printf("i1=%d   i2=%d    i3=%d\n",i1+1,i2+1,i3+1);
            
                x[i1]=(x[i1]+10)*mx;//+getmaxx()/2+p;
                x[i2]=(x[i2]+10)*mx;
                x[i3]=(x[i3]+10)*mx;
                y[i1]=getmaxy()-(y[i1]+10)*my;
                y[i2]=getmaxy()-(y[i2]+10)*my;
                y[i3]=getmaxy()-(y[i3]+10)*my;
                    
                circle(x[i1],y[i1],1);circle(x[i2],y[i2],1);circle(x[i3],y[i3],1);
                    r1=sqrt((x[i2]-x[i1])*(x[i2]-x[i1])+(y[i2]-y[i1])*(y[i2]-y[i1]));
                    r2=sqrt((x[i2]-x[i3])*(x[i2]-x[i3])+(y[i2]-y[i3])*(y[i2]-y[i3]));
                    r3=sqrt((x[i3]-x[i1])*(x[i3]-x[i1])+(y[i3]-y[i1])*(y[i3]-y[i1]));
                    printf("x[i1]=%d y[i1]=%d x[i2]=%d y[i2]=%d x[i3]=%d y[i3]=%d \n",x[i1],y[i1],x[i2],y[i2],x[i3],y[i3]);
               // line(x[i1],y[i1],x[i2],y[i2]);
               // line(x[i2],y[i2],x[i3],y[i3]);
                //line(x[i3],y[i3],x[i1],y[i1]); getch();
                count++;
                if((r1+r2+r3)>perim)
                    {
                            perim=r1+r2+r3;
                                t1=i1; t2=i2; t3=i3;
                                //line(x[t1],y[t1],x[t2],y[t2]);
              }     
}
                // line(x[t1],y[t1],x[t2],y[t2]);
                 //line(x[t2],y[t2],x[t3],y[t3]);
                 //line(x[t3],y[t3],x[t1],y[t1]); getch();
 
 
printf("\nnaydeno %d treugol'nikov",count);
printf("\n-----------------------------------\n");
printf("\ntreugol'nik c max perimetrom %8d obrazyuut tochki %d %d %d\n", perim, t1+1,t2+1,t3+1);
system("PAUSE");
closegraph();
return EXIT_SUCCESS; }
кинула код со всеми закомментированными кусками, ибо пыталась пробовать что-то менять и смотреть что будет.. мне не нужно писать программу, если можно, объясните мне одну вещь: я специально взяла мало точек (Е= количество точек) чтобы посмотреть, порядковый номер точек то есть и прога верно считает, даже выводит правильно количество образованных треугольников, проблема состоит в том, что расстояния от точек она считает неверно. как выяснилось, она неправильно читает сами координаты, то есть вместо допустим х=-9 у=-3 она читает х=29 у=396..

вот что выводит:
koordinaty tochek
-------------------------
# X Y
-------------------------
1 : ( -9, -3)
2 : ( 4, -10)
3 : ( -1, -6)
4 : ( 8, 8)
i1=1 i2=2 i3=3
x[i1]=29 y[i1]=396 x[i2]=406 y[i2]=599 x[i3]=261 y[i3]=483
i1=1 i2=2 i3=4
x[i1]=1131 y[i1]=-11175 x[i2]=12064 y[i2]=-17062 x[i3]=522 y[i3]=77
i1=1 i2=3 i3=4
x[i1]=33089 y[i1]=324384 x[i2]=7859 y[i2]=-13698 x[i3]=15428 y[i3]=-1924
i1=2 i2=3 i3=4
x[i1]=350146 y[i1]=495107 x[i2]=228201 y[i2]=397551 x[i3]=447702 y[i3]=56105

naydeno 4 treugol'nikov
-----------------------------------

treugol'nik c max perimetrom 44348 obrazyuut tochki 1 2 4
Для продолжения нажмите любую клавишу . . .

откуда она берёт эти числа я понять не могу т___т помогите

п.с. раньше считало правильно и расстояния, и периметр, проблема заключалась в том, что я не могла построить линии, соединяющие точки треугольников, когда начала исправлять, доисправляла так, что теперь и это не считает в общем, думаю, эти проблемы взаимосвязаны, но сама не могу найти ошибку %)

надеюсь, понятно объяснила о-о
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2013, 00:02     Графическое изображение геометрических фигур на координатной плоскости
Посмотрите здесь:
C++ HELP!!! движение геометрических фигур
Иерархия геометрических фигур C++
C++ масштабирование геометрических фигур
C++ Вывод геометрических фигур
C++ Вывод на экран геометрических фигур
C++ Вычисление площадей геометрических фигур
C++ иерархия геометрических фигур в ООП
C++ Выбор геометрических фигур из перечисления
Графика - построение геометрических фигур C++
C++ Расчет веса геометрических фигур из различных материалов
Конструктор и деструктор в связанном списке геометрических фигур C++
Реализация базового класса для геометрических фигур C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
29.04.2013, 08:43     Графическое изображение геометрических фигур на координатной плоскости #2
Абсолютно невозможно читать этот код. Вы от того и страдаете.

Не хотите разбить этот код на отдельные сущности? Выделить треугольники в структуры, работу с ними -- в отдельные функции. Так будет значительно проще находить ошибки. Ну и можно очеловечить слегка вывод тоже.

Добавлено через 23 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
 
typedef struct {
  double x, y;
} Point;
 
typedef struct {
  Point a, b, c;
} Triangle;
 
double getDistance(Point a, Point b) {
  return sqrt(pow(a.x - b.x, 2.0) + pow(a.y - b.y, 2.0));
}
 
void printPoint(Point point) {
  printf("Point{x=%.2f,y=%.2f}\n", point.x, point.y);
}
 
void printTriangle(Triangle triangle) {
  printf("Triangle{a=Point{x=%.2f,y=%.2f},b=Point{x=%.2f,y=%.2f},"
    "c=Point{x=%.2f,y=%.2f}}\n",
    triangle.a.x, triangle.a.y, triangle.b.x, triangle.b.y, 
    triangle.c.x, triangle.c.y);
}
 
Point getRandomPoint() {
  Point point = {(rand() % 1000) / 100., (rand() % 1000) / 100.};
  return point;
}
 
Triangle getTriangle(Point a, Point b, Point c) {
  Triangle triangle = {a, b, c};
  return triangle;
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  const int numberOfPoints = 10;
  Point points[numberOfPoints];
  
  // задание случайных точек
  int i;
  for (i = 0; i < numberOfPoints; ++i) {
    points[i] = getRandomPoint();
    printPoint(points[i]);
  }
 
  // поиск максимального треугольника
  double maximumPerimeter = 0;
  Triangle maximumTriangle;
  for (i = 0; i < numberOfPoints - 2; ++i) {
    int j;
    for (j = i + 1; j < numberOfPoints - 1; ++j) {
      double ab = getDistance(points[i], points[j]);
      int k;
      for (k = j + 1; k < numberOfPoints; ++k) {
        double ac = getDistance(points[i], points[k]);
        double bc = getDistance(points[j], points[k]);
        double thisPerimeter = ab + ac + bc;
        if (thisPerimeter > maximumPerimeter) {
          maximumPerimeter = thisPerimeter;
          maximumTriangle = getTriangle(points[i], points[j], points[k]);
        }
      }
    }
  }
 
  // вывод на экран
  printf("Maximum perimeter: %.2f\n", maximumPerimeter);
  printTriangle(maximumTriangle);
  
  return 0;
}
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
29.04.2013, 17:45  [ТС]     Графическое изображение геометрических фигур на координатной плоскости #3
lemegeton, спасибо, конечно, большое за оказанный труд ^___^ ну в общем я сама решила проблему))) код такой нечитабельный из-за того, что я не отбросила куски, которые комментила)) вот в общем решённый код, всё работает проблема заключалась в том, что я описывала координаты точек графически, потом к ним обращалась, вот прога и выводила чушь) сделала отдельные массивы именно для описаний координат графически - всё работает с:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "conio.h"
#include "stdlib.h"
#include "math.h"
#include "graphics.h"
#define z 13
#define e -10
#define g 20
#define E 100
 
#define p -9
#define q 20
 
using namespace std;
 
int main(int argc, char *argv[])
{
int osy,osx,xt,yt,mx,my;
int i,n,t1,t2,t3;
float perim;
int x[E],y[E];
char s[50];
printf("\n koordinaty tochek \n-------------------------\n");
initwindow(600,600);
setbkcolor(15);
cleardevice();
setcolor(5);
my=(getmaxy()/20);
mx=(getmaxx()/20);
setlinestyle(0,1,3);
osy=getmaxy();
osx=getmaxx();
line(osx/2+p,0,osx/2+p,osy);//÷åðòèì îñü îðäèГ*Г*ГІ
line(0,osy/2+q,osx,osx/2+q);// îñü Г*áñöèññ
setlinestyle(1,1,1);
for(i=-10;i<11;i++)
{
setcolor(z);
xt=mx*(i+10);
line(xt,0,xt,osy);//âåðòèêГ*ëüГ*ûå ëèГ*ГЁГЁ
sprintf(s,"%d",i);
setcolor(0);
outtextxy(xt,osy/2+24,s);
}
for(i=-10;i<11;i++)
{
setcolor(z);
yt=my*(i+10);
line(0,yt,osx,yt);//ãîðèçîГ*ГІГ*ëüГ*ûå ëèГ*ГЁГЁ
sprintf(s,"%d",i);
setcolor(0);
outtextxy(osx/2-25,osy-yt,s);
}
n=E;
for(int i=0; i<n; i++)
    {
        x[i]=e+rand()%g;
        y[i]=e+rand()%g;
    }
printf(" \n\tX\tY\n-------------------------\n");
for(int i=0; i<n; i++)
    {
        printf("%2d : (%4d, %4d)\n", i+1,x[i],y[i]);
    }
t1=-1;t2=-1;t3=-1;perim=0;
if (n<3)
{
        printf("nedostatochno tochek dlya postroenia treugol'nika...");
        getch();
        return 0;
}
setcolor(0);
setlinestyle(0,1,3);
int x1[E],y1[E],count=0;
float r1,r2,r3;
for(int i1=0; i1<n-2; i1++)
    for(int i2=i1+1; i2<n-1; i2++)
        for(int i3=i2+1; i3<n; i3++)
            {           
                x1[i1]=(x[i1]+10)*mx;
                x1[i2]=(x[i2]+10)*mx;
                x1[i3]=(x[i3]+10)*mx;
                y1[i1]=getmaxy()-(y[i1]+10)*my;
                y1[i2]=getmaxy()-(y[i2]+10)*my;
                y1[i3]=getmaxy()-(y[i3]+10)*my;
                    
                circle(x1[i1],y1[i1],1);circle(x1[i2],y1[i2],1);circle(x1[i3],y1[i3],1);
                    r1=sqrt((x[i2]-x[i1])*(x[i2]-x[i1])+(y[i2]-y[i1])*(y[i2]-y[i1]));
                    r2=sqrt((x[i2]-x[i3])*(x[i2]-x[i3])+(y[i2]-y[i3])*(y[i2]-y[i3]));
                    r3=sqrt((x[i3]-x[i1])*(x[i3]-x[i1])+(y[i3]-y[i1])*(y[i3]-y[i1]));
                count++;
                if((r1+r2+r3)>perim)
                    {
                            perim=r1+r2+r3;
                                t1=i1; t2=i2; t3=i3;
              }     
}
                x1[t1]=(x[t1]+10)*mx;
                x1[t2]=(x[t2]+10)*mx;
                x1[t3]=(x[t3]+10)*mx;
                y1[t1]=getmaxy()-(y[t1]+10)*my;
                y1[t2]=getmaxy()-(y[t2]+10)*my;
                y1[t3]=getmaxy()-(y[t3]+10)*my;
                 line(x1[t1],y1[t1],x1[t2],y1[t2]);
                 line(x1[t2],y1[t2],x1[t3],y1[t3]);
                 line(x1[t3],y1[t3],x1[t1],y1[t1]);
 
 
printf("\nnaydeno %d treugol'nikov",count);
printf("\n-----------------------------------\n");
printf("\ntreugol'nik c max perimetrom %8.3f obrazyuut tochki %d %d %d\n", perim, t1+1,t2+1,t3+1);
system("PAUSE");
closegraph();
return EXIT_SUCCESS; }
Yandex
Объявления
29.04.2013, 17:45     Графическое изображение геометрических фигур на координатной плоскости
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru