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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.80
obZen
1 / 1 / 0
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 16:16     Рисование линий по координатам #1
Здравствуйте!
Возникла необходимость нарисовать линию по координатам.
Есть ли в С++ ф-я, подобная ф-ии line в Pascal?
Pascal
1
line (x, y, x2, y2);
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2011, 16:16     Рисование линий по координатам
Посмотрите здесь:

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

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

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


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

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

С помощью MoveTo, LineTo, это можно было бы реализовать с помощью одного цикла и 4 строк.. только объясните как пользоваться..
А так...
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
13.04.2011, 18:10     Рисование линий по координатам #10
Мне кажется, лучше это рисовать не в консоли, а с помощью OpenGL\DirectX.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
13.04.2011, 18:10     Рисование линий по координатам #11
Да нет, помоему сложнее передвигать зеленый квадрат в консоли)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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
Чем не поле?
obZen
1 / 1 / 0
Регистрация: 11.03.2011
Сообщений: 22
13.04.2011, 18:25  [ТС]     Рисование линий по координатам #13
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Мне кажется, лучше это рисовать не в консоли, а с помощью OpenGL\DirectX.
как бы так объяснить... необходма реализация программы на том уровне, к-й сейчас преподают.
Т.е. если увидят реализацию с помощью OpenGL, появится много новых вопросов и претензий. А этого не хотелось бы...

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

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

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

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

Добавлено через 3 минуты
Цитата Сообщение от neske Посмотреть сообщение
Да нет, помоему сложнее передвигать зеленый квадрат в консоли)
Передвигать я умею)
Вот только по чему его передвигать? По сетке... а эту сетку необходимо нарисовать!...
Xtir
11 / 11 / 0
Регистрация: 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();
}
длину и ширину сам уже подкорректируешь
IrineK
Заблокирован
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;
}
Изображения
 
IrineK
Заблокирован
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;
}
Изображения
 
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
13.04.2011, 22:06     Рисование линий по координатам #17
Даже не знал, что в консоли можно такое делать)
obZen
1 / 1 / 0
Регистрация: 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); - подозреваю, что это объект? стыдно, но с объектами ещё не работал...

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

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

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

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

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

Цитата Сообщение от IrineK Посмотреть сообщение
Передвигать квадрат намного сложнее, чем нарисовать сетку.
А в чем сложность? по коду не видно ?
За пример спасибо, может в жизни пригодится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2011, 23:51     Рисование линий по координатам
Еще ссылки по теме:

C++ Создание типов линий
Вычислить по координатам C++
C++ Нарисовать 5 линий в Codeblocks

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
13.04.2011, 23:51     Рисование линий по координатам #20
obZen,
вам сюда: http://radiofront.narod.ru/htm/prog/...api/paint.html
Yandex
Объявления
13.04.2011, 23:51     Рисование линий по координатам
Ответ Создать тему
Опции темы

Текущее время: 22:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru