Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
1

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

29.04.2013, 00:02. Просмотров 2627. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2013, 00:02
Ответы с готовыми решениями:

Нужно изобразить на координатной прямой или на координатной плоскости множества истинности следующего предиката
Помогите пожалуйста Добавлено через 1 минуту (\sin x&gt;0)\sim (\cos x&lt;\pi /2)

Написать уравнение плоскости, проходящей через точку М(1,1,1) и параллельной координатной плоскости XOY
помогите решить

Построение геометрических фигур
Здравствуйте, уважаемые господа программеры. Не буду прикидываться опытным кодером, впервые...

Расположение геометрических фигур
В программе для работы с графами необходимо его визуализировать, в форме кружков, по окружности,...

2
3050 / 1455 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
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
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2013, 17:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Классы геометрических фигур
Всем привет! У меня возникли сложности с пониманием и реализацией задания. Имеется задание...

Рисование геометрических фигур
как реализовать эту геометрическую фигуру?

Названия геометрических фигур
Подскажите, пожалуйста, названия следующих геометрических поверхностей. z = x2 + y2 z = x2 - y2...

HELP!!! движение геометрических фигур
Нужна помощь в написании программы движения круга на экране хотя бы чтоб двигался туда сюда по...


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

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

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