Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
1

Графика, перемещение ромба

17.09.2014, 00:33. Просмотров 1054. Ответов 16
Метки нет (Все метки)

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
#include <iostream>
#include "graphics.h"
#include <stdlib.h>
#include <stdio.h>
 
 
using namespace std;
   int xmax, ymax; 
 
void Peremeshenie() {
       xmax = getmaxx(); 
       ymax = getmaxy();
 
    for (int i=xmax; i<getmaxx()*getmaxy(); i++) {
        cleardevice();
        for (int j=ymax; j<getmaxx()*getmaxy(); j++) {
            
            cleardevice();
 
            
       line(i/2, j/2, i/3, j/3);
       line(i/3, j/3, i/2, (j/2)-160);
       line(i/2, (j/2)-160, (i/3)+212, (j/2)-80);
       line((i/3)+212, (j/2)-80, i/2, j/2);
       delay(15);
            }
        
    }
}
                   
 
int main()
{
   
   int gdriver = DETECT, gmode, errorcode;
 
 
   initgraph(&gdriver, &gmode, "");
   
   errorcode = graphresult();
  
   if (errorcode != grOk)
   {
     cout<<"ERROR"<<grapherrormsg(errorcode);
     cout<<"Press any key to halt:";
     cin.get(); //Ожидаем нажатие клавиши
      exit(1); //Выход
   }
//Если ошибки не произошло программа работает в графическом режиме
  
   xmax = getmaxx(); //Запоминаем правый конец экрана
   ymax = getmaxy();//Запоминаем самый низ экрана
 
    setbkcolor(15);
    cleardevice();
    setcolor(0);
 
    line(xmax/2,0,xmax/2,ymax);
    line(0,ymax/2,xmax,ymax/2);
 
   line(xmax/2, ymax/2, xmax/3, ymax/3);
   line(xmax/3, ymax/3, xmax/2, (ymax/2)-160);
   line(xmax/2, (ymax/2)-160, xmax/3+212, (ymax/2)-80);
   line(xmax/3+212, (ymax/2)-80, xmax/2, ymax/2);
 
  Peremeshenie();
 
   
 
   
   cin.get();
   closegraph();
   return 0;
}
моя проблема в том, что ромб движется только по оси 0y(и почему-то одна точка отстает...), почему так, объясните нубу, с графоном первый раз столкнулся, надо чтобы двигалось вообще по всей координатной плоскости и чтобы отталкивалось от стенок. Накидайте идей, как сделать.
Всем спасибо

 Комментарий модератора 
Очередное предупреждение: называйте темы информативно
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2014, 00:33
Ответы с готовыми решениями:

Даны две диагонали ромба. Вычислить площадь и периметр этого ромба
нужен код программы,заранее спасибо

Даны две диагонали ромба. Вычислить площадь и периметр этого ромба
Помогите написать программу, с кодом BORLANDC

Рисование ромба
Нужно нарисовать ромб используя символ * и цикл for. Ромб должен быть закрашен символами *. Как...

Рисование ромба.
Приветствую. У Дейтелов есть задания ( глава 5, задание 5.23 - 24 ): 5.23 Напишите программу,...

Наследование ромба от квадрата
Подскажите, пожалуйста, как реализовать наследование ромба от квадрата. Обычно наследуется квадрат...

16
IrineK
Заблокирован
17.09.2014, 00:56 2
Цитата Сообщение от RayPas Посмотреть сообщение
Накидайте идей, как сделать
Написать класс "ромб" и работать с объектом этого класса.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 09:00  [ТС] 3
объясните хотя бы, почему точка вторая так отстает?
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 09:40 4
У Вас сначала перебираются ВСЕ точки по j от maxy до maxy*maxx, а только потом i меняется.
Мне кажется, Вы имели ввиду такой цикл
C++
1
2
3
4
5
for (int i=0; i<getmaxx(); i++)
 {
        for (int j=ymax; j>=0; j--) 
       {
            cleardevice();
0
17.09.2014, 09:40
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 10:11  [ТС] 5
zss, так он вообще только от точки (0,Ymax/2) ползет вверх...надо чтоб по экрану носился

Добавлено через 17 минут
понял, вся проблема в организации цикла...и понял почему угол отстает, но как исправить...пока нет мыслей
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 10:17 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int rombsize=50;// половина стороны
int delta=50;// Сдвиг нижнего угла ромба по x
for (int i=0; i<getmaxx(); i++)
 {
        for (int j=ymax; j>=0; j--) 
       {
            cleardevice();
           line(i-rombsize, j-rombsize, i+rombsize, j-rombsize);
           line(i+rombsize, j-rombsize, i+rombsize+delta, j+rombsize);
           line( i+rombsize+delta, j+rombsize, i-rombsize+delta,  j+rombsize);
           line( i-rombsize+delta,  j+rombsize, i-rombsize, j-rombsize);
           delay(15);
       }
 }
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 10:23  [ТС] 7
zss,вот такая траектория получилась с Вашим кодом...снизу вверх
0
Миниатюры
Графика, перемещение ромба  
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 10:30 8
Так Вы же изначально хотели снизу-вверх.
Если это не так, то поменяйте for (int j=ymax; j>=0; j--)
на for (int j=0; j<ymax; j++)
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 10:43  [ТС] 9
zss, изначально нужно чтоб бегал по экрану и при соприкосновении со стенками шел в другую сторону
и форму ромба он даже не сохранил...((

Добавлено через 8 минут
zss,
вот это пока самый вменяемый вариант, который мне подходит, правда отстают координаты. и идет только по одной оси...извиняюсь, если не правильно формулирую задание.
C++
1
2
3
4
5
6
7
8
9
10
11
for (int i=xmax; i<getmaxy()*getmaxx(); i++) {
        
        for (int j=ymax; j<getmaxy()*getmaxx(); j++) {
           cleardevice();
           line(i/2, j/2, i/3, j/3);
           line(i/3, j/3, i/2, (j/2)-160);
           line(i/2, (j/2)-160, (i/3)+212, (j/2)-80);
           line((i/3)+212, (j/2)-80, i/2, j/2);
           delay(15); 
}
}
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 11:00 10
Цитата Сообщение от RayPas Посмотреть сообщение
при соприкосновении со стенками шел в другую сторону
И где это написано в исходном тексте?
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
int dy=rand()%10-5; // скорость по y
int dx=rand()%10-5;// скорость по x
int i=maxx/2; // ставим ромб в середину экрана
int j=maxy/2;
int rombsize=50;// половина стороны
int delta=50;// Сдвиг нижнего угла ромба по x
for (;;)
 {
           j+=dy; // пересчет координат
           i+=dx;
           if(j<rombsize) // отражение от верха
                dy=abs(dy);
           if(j>maxy-rombsize) // отражение от низа
                dy=-abs(dy);
           if(i<rombsize) // отражение слева
                dx=abs(dx);
           if(i>maxx-rombsize-delta) // отражение справа
                dx=-abs(dx);
           cleardevice();
           line(i-rombsize, j-rombsize, i+rombsize, j-rombsize);
           line(i+rombsize, j-rombsize, i+rombsize+delta, j+rombsize);
           line( i+rombsize+delta, j+rombsize, i-rombsize+delta,  j+rombsize);
           line( i-rombsize+delta,  j+rombsize, i-rombsize, j-rombsize);
           delay(25);
 }
1
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 11:15  [ТС] 11
zss, а чтоб ромб был правильной формы, что поменять нужно?
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 12:15 12
Цитата Сообщение от RayPas Посмотреть сообщение
что поменять нужно
Для ромба пересчитайте координаты поаккуратнее.
Высота получается не 2*rombsize а
sqrt( 2*rombsize*2*rombsize-delta*delta)
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 12:21  [ТС] 13
а еще скажите пожалуйста, чтобы по ходу менялся размер фигуры, нужны еще один цикл вбить?
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 12:28 14
Никаких дополнительных циклов не надо.
В том месте, где у меня написано "// пересчет координат"
меняете все нужные параметры, например можете написать
C++
1
2
3
4
5
6
7
j+=dy; // пересчет координат
i+=dx;
rombsize+=ds;
if(rombsize>200)
     ds-=abs(ds);
if(rombsize<50)
     ds=abs(ds);
ds (скорость изменения размера) естественно объявите вне цикла.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
17.09.2014, 12:43  [ТС] 15
zss, объявил, но что-то ничего не происходит, все осталось как было, т.е. движение с фикс.размером
0
zss
Модератор
Эксперт С++
9078 / 7869 / 4850
Регистрация: 18.12.2011
Сообщений: 20,992
Завершенные тесты: 1
17.09.2014, 13:37 16
Цитата Сообщение от RayPas Посмотреть сообщение
фикс.размером
А какое значение Вы задали для ds?
Для начала задайте int ds=1;
0
alsav22
5465 / 4860 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.09.2014, 07:01 17
Набросок:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstdlib>
#include "graphics.h"
using namespace std;
 
struct Point
{
    int x;
    int y;
    
    Point() : x(0), y(0)
    {}
    Point(int a, int b) : x(a), y(b)
    {}
};
 
class Rhomb
{
    Point A;
    Point B;
    Point C;
    Point D;
    int size_x;
    int size_y;
 
public:
    Rhomb(Point a, int sx, int sy) : A(a), size_x(sx), size_y(sy)
    {
        B.x = A.x + size_x; B.y = A.y + size_y;
        C.x = A.x; C.y = B.y + size_y;
        D.x = A.x - size_x; D.y = B.y;
    }
    
    void draw()
    {
        line(A.x, A.y, B.x, B.y);
        line(B.x, B.y, C.x, C.y);
        line(C.x, C.y, D.x, D.y);
        line(D.x, D.y, A.x, A.y);
    }
    
    void Down(int n = 1) 
    {
        int i = getmaxy();
        for ( ; C.y < i; ) 
        {
            cleardevice();
            A.y += n; B.y += n; C.y += n; D.y += n;
            draw();
            delay(15);
        }
    }
 
    void Up(int n = 1) 
    {
        for ( ; A.y > 0; ) 
        {
            cleardevice();
            A.y -= n; B.y -= n; C.y -= n; D.y -= n;
            draw();
            delay(15);
        }
    }
 
    void Left(int n = 1) 
    {
        for ( ; D.x > 0; ) 
        {
            cleardevice();
            A.x -= n; B.x -= n; C.x -= n; D.x -= n;
            draw();
            delay(15);
        }
    }
 
    void Right(int n = 1) 
    {
        int i = getmaxx();
        for ( ; B.x < i; ) 
        {
            cleardevice();
            A.x += n; B.x += n; C.x += n; D.x += n;
            draw();
            delay(15);
        }
    }
};
 
int main()
{
    int gdriver = DETECT, gmode, errorcode;
    
    initgraph(&gdriver, &gmode, "");
 
    errorcode = graphresult();
 
    if (errorcode != grOk)
    {
        cout<<"ERROR"<<grapherrormsg(errorcode);
        cout<<"Press any key to halt:";
        getch(); //Ожидаем нажатие клавиши
        exit(1); //Выход
    }
    //Если ошибки не произошло программа работает в графическом режиме
    
    setbkcolor(15);
    cleardevice();
    setcolor(0);
    
    
    Point A(260, 150);
    int size_x = 70;
    int size_y = 40;
    
    Rhomb rhomb(A, size_x, size_y);
    
    for (int i = 0; i < 4; ++i)
    {
        rhomb.Down(4);
        rhomb.Up();
        rhomb.Left(6);
        rhomb.Right(3);
    }
    
    getch();
    closegraph();
    return 0;
}
0
18.09.2014, 07:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2014, 07:01

Вывод ромба циклами for
Я опять посыпался на выводе этих звёздочек и пробелов. Как можно решить? Уже не знаю, что делать с...

Рисование ромба (рекурсия)
Подскажите пжл как это можно написать рекурсией. #include &lt;iostream&gt; using namespace std; ...

найти площадь ромба
Помогите. задание, ввести одну сторону ромба и диагональ


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

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

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