Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/141: Рейтинг темы: голосов - 141, средняя оценка - 4.97
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
1

Рисование линий по координатам

13.04.2011, 16:16. Показов 29295. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Возникла необходимость нарисовать линию по координатам.
Есть ли в С++ ф-я, подобная ф-ии line в Pascal?
Pascal
1
line (x, y, x2, y2);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2011, 16:16
Ответы с готовыми решениями:

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3...

Построить несколько линий в пространстве по координатам
Здравствуйте! Подскажите, можно ли построить в программе несколько линий в пространстве по...

Массив: отрисовка массива линий по координатам
Создать программу выполняющую действия: 1)вводить и сохранять в массиве данных введенные...

Рисование линий
Дорогие друзья! Я создаю что-то типа редактора изображений. Но вдруг у меня из памяти вылетело. Как...

24
14 / 14 / 4
Регистрация: 10.07.2010
Сообщений: 130
13.04.2011, 16:24 2
есть
C++
1
MoveTo(x,y)
и
C++
1
LineTo(x2,y2)
0
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 16:42  [ТС] 3
Цитата Сообщение от Xtir Посмотреть сообщение
есть
C++
1
MoveTo(x,y)
и
C++
1
LineTo(x2,y2)
Какая библиотека для этого нужна?
0
Заблокирован
13.04.2011, 17:09 4
Есть ли в С++ ф-я, подобная ф-ии line в Pascal?
Совершенно подобное нечто можно найти в TurboC. Как и в Pascal - рисуем в режиме VGA.
Достаточно подключить:
C++
1
#include <graphics.h>
Если же рисуем под Windows, задача имеет великое множество решений. Уточните, в чем именно работаем.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.04.2011, 17:10 5
Xtir, не надо вводить людей в заблуждение. В стандарте языка нет таких функций.

obZen, существует множество библиотек для работы с графикой. Какая именно тебя интересует?
0
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 17:29  [ТС] 6
IrineK, Nameless One: работаю в Visual Studio C++, в консольном окне.
Необходимо нарисовать таблицу, к примеру, размером 10*10 ячеек, все ячейки одинаковые.
Т.е. желательно, чтобы линии были непрерывными - тирэ и вертикальными слешами рисовать неудобно, да и не получу необходимый эффект...

Цитата Сообщение от Nameless One Посмотреть сообщение
Xtir, не надо вводить людей в заблуждение. В стандарте языка нет таких функций.
Xtir, есть реализация данных ф-й?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.04.2011, 17:41 7
obZen, единственная известная мне библиотека для вывода в консоль, которая хоть как-то развивается - это *curses. Вроде и под Windows она портирована тоже.
Под твой компилятор предложенный вариант с graphics.h не подойдет, т.к. Turbo C давно скончался вместе с DOS'ом и необходимостью подобных библиотек для Windows.
Ты уточни задачу, вдруг тут можно обойтись обычным форматированным выводом.
Ну и, конечно, можно создать простенькое GUI-приложение с помощью какого-нибудь тулкита - тут уж выбор действительно богатый.
0
Заблокирован
13.04.2011, 17:43 8
Все-таки, лучший вариант для таблицы в консоли
тирэ и вертикальными слешами рисовать
Скорее всего, ваша проблема в форматированном выводе.


В противном случае - углубляйтесь в WinAPI. Эффекты - потрясающие.
0
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 18:08  [ТС] 9
Цитата Сообщение от Nameless One Посмотреть сообщение
obZen,
Ты уточни задачу, вдруг тут можно обойтись обычным форматированным выводом.
Необходимо нарисовать поле для игры в сапер, примерно выглядит так(набросил в пеинте):
Название: Безымянный.JPG
Просмотров: 1301

Размер: 3.8 Кб
Зеленая ячейка будет перемещаться с помощью стрелочек.
Как оказалось, самое сложное - это нарисовать это поле.

С помощью MoveTo, LineTo, это можно было бы реализовать с помощью одного цикла и 4 строк.. только объясните как пользоваться..
А так...
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
13.04.2011, 18:10 10
Мне кажется, лучше это рисовать не в консоли, а с помощью OpenGL\DirectX.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.04.2011, 18:10 11
Да нет, помоему сложнее передвигать зеленый квадрат в консоли)
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.04.2011, 18:15 12
PraZuBeR, это называется "стрелять из пушки по воробьям".
А по поводу задачи - можно поле сделать следующим образом. Пустая ячейка обозначается одним символом, занятая - другим, а роль линий играют символы пробела:
Код
o o o o o
o o o o o
o o o o o
o x o o o
o o o o o
Чем не поле?
0
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 18:25  [ТС] 13
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Мне кажется, лучше это рисовать не в консоли, а с помощью OpenGL\DirectX.
как бы так объяснить... необходма реализация программы на том уровне, к-й сейчас преподают.
Т.е. если увидят реализацию с помощью OpenGL, появится много новых вопросов и претензий. А этого не хотелось бы...

Алгоритм игры, рекурсивный поиск, перемещение выделенной ячейки впринципе все это уже продумал...
Проблема, как это разместить графически.

Была идея вызывать ф-ю, которая печатала бы по 1 символу в указанных координатах: █, █, ▀, ▀. Тогда одна ячейка выглядела бы так:
██
▀▀ - в консоли это был бы квадрат.., т .е ██.

НО! Если брать поле размером 10х10 таких ячеек, то эту ф-ю необходимо вызывать 400 раз, что само по себе уже неприемлемо...

Вот и интересуюсь как можно реализовать сетку другим способом...

Добавлено через 3 минуты
Цитата Сообщение от neske Посмотреть сообщение
Да нет, помоему сложнее передвигать зеленый квадрат в консоли)
Передвигать я умею)
Вот только по чему его передвигать? По сетке... а эту сетку необходимо нарисовать!...
0
14 / 14 / 4
Регистрация: 10.07.2010
Сообщений: 130
13.04.2011, 19:16 14
Цитата Сообщение от Nameless One Посмотреть сообщение
Xtir, не надо вводить людей в заблуждение. В стандарте языка нет таких функций.
понятия не имею какие функции входят в стандарт с++, а какие нет, но знаю точно, что если создать приложение хотя бы на базе диалогового окна, то уже можно пользоваться этими функциями без подключения каких-либо дополнительных библиотек

Цитата Сообщение от obZen Посмотреть сообщение
...
Вот только по чему его передвигать? По сетке... а эту сетку необходимо нарисовать!...
если ты в консоли собираешься делать, то без понятия... ну а если хотя бы в том же диалоговом приложении, то просто добавь в функцию OnPaint() следующие строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
else
{
    CPaintDC dc(this);
 
    for(int i = 0; i < 10; ++i)
    {
        dc.MoveTo(i*40,0);
        dc.LineTo(i*40,300);
        dc.MoveTo(0,i*40);
        dc.LineTo(300,i*40);
    }
 
    CDialog::OnPaint();
}
длину и ширину сам уже подкорректируешь
0
Заблокирован
13.04.2011, 19:59 15
Рисуем в консоли:

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
#if       _WIN32_WINNT < 0x0500
  #undef  _WIN32_WINNT
  #define _WIN32_WINNT   0x0502 // I've got SP2
#endif
//если у вас работает без этих четырех строк - просто уберите их
 
#include <windows.h>
#include <conio.h>
#include <iostream>
 
int main()
      {
        HWND hWnd=GetConsoleWindow();
                HDC hDC=GetDC(hWnd);
        
        HPEN cP = CreatePen(PS_SOLID, 2, RGB(0,255,0));
        SelectObject(hDC,cP); 
        POINT p; 
        int x=10,y=10,i;
        
        for(i=0;i<6;i++)
        {   MoveToEx(hDC,x+i*20,y,&p);
            LineTo(hDC,x+i*20,y+100);
        }
        for(i=0;i<6;i++)
        {   MoveToEx(hDC,x,y+i*20,&p);
            LineTo(hDC,x+100,y+i*20);
        }
 
        std::cin.get();
return 0;
}
Изображения
 
3
Заблокирован
13.04.2011, 22:02 16
Лучший ответ Сообщение было отмечено как решение

Решение

neske был прав. Передвигать квадрат намного сложнее, чем нарисовать сетку.)

Вот сетка и бегающий по ней квадрат (за пределы не выбегает). К-во ячеек можно менять.

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
#if       _WIN32_WINNT < 0x0500
  #undef  _WIN32_WINNT
  #define _WIN32_WINNT   0x0502 // I've got SP2
#endif
//если у вас работает без этих четырех строк - просто уберите их
 
#include <windows.h>
#include <conio.h>
 
#define UP_ARROW 72
#define LEFT_ARROW 75
#define DOWN_ARROW 80
#define RIGHT_ARROW 77
#define N 10  // NхN ячеек
 
 
/*********************************class SQ*****************************************/
class SQ
{   private:
        int _x;
        int _y;
    public:
    SQ():_x(0),_y(0) {}
    SQ(int x,int y)
        {_x = x;_y = y;}
    ~SQ() {}
    
    void setX(int);
    void setY(int);
    int getX();
    int getY();
    void drawSq(HDC, COLORREF);
    void moveIt(HDC);
};
 
void SQ::setX(int x){_x = x;}
 
void SQ::setY(int y) {_y = y;}
 
int SQ::getX() {return _x;}
 
int SQ::getY() {return _y;}
 
void SQ::drawSq(HDC hDC, COLORREF clr)
{   HBRUSH NewBrush = CreateSolidBrush(clr);
    SelectObject(hDC, NewBrush);
    Rectangle(hDC, this->getX(), this->getY(), this->getX()+20, this->getY()+20);
    DeleteObject(NewBrush);
}
 
void SQ::moveIt(HDC hDC)
{   int KeyStroke;
    KeyStroke = getch();
    if (KeyStroke == 224)
    {   KeyStroke = getch(); 
        switch (KeyStroke)
        {
        case UP_ARROW:
            this->drawSq(hDC,RGB(0, 0, 0));
            if(this->getY()!=10) this->setY(this->getY()-20);
            this->drawSq(hDC,RGB(250, 25, 5));
            break;
        case DOWN_ARROW:
            this->drawSq(hDC,RGB(0, 0, 0));
            if(this->getY()!=-10+N*20) this->setY(this->getY()+20);
            this->drawSq(hDC,RGB(250, 25, 5));
            break;
        case LEFT_ARROW:
            this->drawSq(hDC,RGB(0, 0, 0));
            if(this->getX()!=10) this->setX(this->getX()-20);
            this->drawSq(hDC,RGB(250, 25, 5));
            break;
        case RIGHT_ARROW:
            this->drawSq(hDC,RGB(0, 0, 0));
            if(this->getX()!=-10+N*20) this->setX(this->getX()+20);
            this->drawSq(hDC,RGB(250, 25, 5));
        break;
        }
    }
}
 
/*********************************************************************************/
int main()
      {
    HWND hWnd=GetConsoleWindow();
        HDC hDC=GetDC(hWnd);
        
    HPEN cP = CreatePen(PS_SOLID, 2, RGB(0,255,0));
    SelectObject(hDC,cP); 
    POINT p; 
    int x=10,y=10,i;
        
        for(i=0;i<N+1;i++)
        {   MoveToEx(hDC,x+i*20,y,&p);
            LineTo(hDC,x+i*20,y+N*20);
        }
        for(i=0;i<N+1;i++)
        {   MoveToEx(hDC,x,y+i*20,&p);
            LineTo(hDC,x+N*20,y+i*20);
        }
        
    SQ sq(10,10);
    sq.drawSq(hDC,RGB(250, 25, 5));
        
    while(1)
        sq.moveIt(hDC);
 
return 0;
}
Изображения
 
3
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.04.2011, 22:06 17
Даже не знал, что в консоли можно такое делать)
0
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 23:34  [ТС] 18
Цитата Сообщение от Xtir Посмотреть сообщение
если ты в консоли собираешься делать, то без понятия... ну а если хотя бы в том же диалоговом приложении, то просто добавь в функцию OnPaint()
Откуда появилась ф-я OnPaint? В моё проекте её не было, так что добавлять указанный код некуда

Цитата Сообщение от IrineK Посмотреть сообщение
Рисуем в консоли:
Спасибо! Это именно то, что нужно! Если есть возможность(желание), дайте некоторые объяснения, для полного понимания мной:

HWND - это тип данных?
hWnd - переменная этого типа?
GetConsoleWindow() - дескриптор, как например GetStdHandle и подобные?
HDC hDC=GetDC(hWnd); - объясните, что происходить здесь?
HPEN cP = CreatePen(PS_SOLID, 2, RGB(0,255,0)); - создание линии. Но что такое PS_SOLID остаётся в тумане...
SelectObject(hDC,cP); - подозреваю, что это объект? стыдно, но с объектами ещё не работал...

Остальное понятно.

"Бегающую" ячейку брать не буду, т.к. есть своя реализация, без помощи классов. Да и копипастить все не хочу))

Огромное спасибо, что помогли и извините за глупые вопросы
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.04.2011, 23:48 19
Цитата Сообщение от Xtir Посмотреть сообщение
уже можно пользоваться этими функциями без подключения каких-либо дополнительных библиотек
#include <windows.h>
Это так чтоб запутать

Цитата Сообщение от Xtir Посмотреть сообщение
. ну а если хотя бы в том же диалоговом приложении
А на чем пишем ??? WinApi? MFC? CLR? или Борланд(как у них обзывается?)

Цитата Сообщение от Xtir Посмотреть сообщение
добавь в функцию OnPaint()
ниче что это обработчик WM_PAINT?

Цитата Сообщение от IrineK Посмотреть сообщение
Передвигать квадрат намного сложнее, чем нарисовать сетку.
А в чем сложность? по коду не видно ?
За пример спасибо, может в жизни пригодится.
0
Заблокирован
13.04.2011, 23:51 20
obZen,
вам сюда: http://radiofront.narod.ru/htm... paint.html
1
13.04.2011, 23:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2011, 23:51
Помогаю со студенческими работами здесь

Рисование линий
Есть маленькая форма, на ней можно мышкой рисовать линии. Соль в том что в Paint сохраняется...

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

Рисование линий
Подскажите как нарисовать подряд линии? Graphics gr = e.Graphics; Pen p = new...

рисование линий
помогите пожалуйста. мне надо,чтобы по нажатию мыши в вершинах многоугольника(я его загружаю через...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru