Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

29.04.2013, 00:02. Просмотров 1703. Ответов 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
Для продолжения нажмите любую клавишу . . .

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

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

надеюсь, понятно объяснила о-о
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2013, 00:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Графическое изображение геометрических фигур на координатной плоскости (C++):

Иерархия геометрических фигур - C++
Проблема с классами, никак не могу из за этого написать последнюю прогу... Помогуте если не сложно Создайте простую иерархию...

HELP!!! движение геометрических фигур - C++
Нужна помощь в написании программы движения круга на экране хотя бы чтоб двигался туда сюда по одной линии, использование методов &quot;дров&quot; и...

масштабирование геометрических фигур - C++
Было задание: Построить систему классов для описания плоских геометрических фигур: круг, квадрат, прямоугольник. Предусмотреть методы...

Вывод геометрических фигур - C++
Привет всем! Такая проблема: С треугольниками разобрался- могу выводить с помощю цыклов разные и в разных ракурсах. Вот код: #include...

Вывод на экран геометрических фигур - C++
Дали курсач. Задание: разработать программу, обеспечивающую изображение на экране дисплея определенного набора плоских и...

иерархия геометрических фигур в ООП - C++
Здравствуйте уважаемые формучани, нужна ваша помощь ибо я уже не знаю что делать. В общем задание построить иерархию геометрических фигур...

2
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
}
1
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; }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2013, 17:45
Привет! Вот еще темы с ответами:

Графика - построение геометрических фигур - C++
Я что-то вообще не могу понять, как выполнять это задание. Считать данные не проблема, а как построить да ещё и с заданными углами...

Вычисление площадей геометрических фигур - C++
Программа на языке C++. Вводятся длины сторон прямоугольника, найти его площадь и периметр. Эта программа находит площадь и периметр....

Выбор геометрических фигур из перечисления - C++
Что необходимо написать для того что бы ввести потом 1,2,3 или 4 и выбрать соответсвующую фигуру? Задача: Вычислите площадь...

Расчет веса геометрических фигур из различных материалов - C++
Условия задания таковы: &quot; Расчет веса геометрических фигур из различных материалов &quot;. Нужна помощь... сразу благодарю.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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