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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.80
obZen
1 / 1 / 0
Регистрация: 11.03.2011
Сообщений: 22
#1

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

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

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

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

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

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

Рисование линий - C#
Подскажите как нарисовать подряд линии? Graphics gr = e.Graphics; Pen p = new Pen(Color.Blue, 5);// цвет линии и ширина ...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
}
3
Изображения
 
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
13.04.2011, 22:06 #17
Даже не знал, что в консоли можно такое делать)
0
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); - подозреваю, что это объект? стыдно, но с объектами ещё не работал...

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

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

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

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

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

Цитата Сообщение от IrineK Посмотреть сообщение
Передвигать квадрат намного сложнее, чем нарисовать сетку.
А в чем сложность? по коду не видно ?
За пример спасибо, может в жизни пригодится.
0
IrineK
Заблокирован
13.04.2011, 23:51 #20
obZen,
вам сюда: http://radiofront.narod.ru/htm/prog/...api/paint.html
1
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
13.04.2011, 23:59 #21
obZen,
консоль это такое же окно как и другие
поэтому посмотри любую книгу про Windows раздел графики
лучше всех по моему Петзолд

Цитата Сообщение от obZen Посмотреть сообщение
HWND - это тип данных?
хендер окна( в виндосе все на хендерах)

Цитата Сообщение от obZen Посмотреть сообщение
hWnd - переменная этого типа?
да
Цитата Сообщение от obZen Посмотреть сообщение
GetConsoleWindow()
получить хендер консоли
Цитата Сообщение от obZen Посмотреть сообщение
HDC hDC=GetDC(hWnd); - объясните, что происходить здесь?
получить дескриптор для рисования Система может рисовать не только в окне но и на принтере плотере......
везде будет один и тот же код просто меняем дескриптор
Цитата Сообщение от obZen Посмотреть сообщение
HPEN cP = CreatePen(PS_SOLID, 2, RGB(0,255,0)); - создание линии. Но что такое PS_SOLID остаётся в тумане...
создание пера если будешь рисовать линию надо выбрать перо
конкретно здесь сплошное PS_SOLID ширина 2 цвет зеленый RGB(0,255,0)
Цитата Сообщение от obZen Посмотреть сообщение
SelectObject(hDC,cP);
выбрать перо в дескриптор рисования
1
obZen
1 / 1 / 0
Регистрация: 11.03.2011
Сообщений: 22
14.04.2011, 00:12  [ТС] #22
Цитата Сообщение от IrineK Посмотреть сообщение
Спасибо огромное! Буду учить)

Такой вопрос: нарисовал поле 10х10. Если прокрутить окно вниз и вернуться обратно, изображение стирается...

Добавлено через 2 минуты
ValeryS, Оо.. Спасибо! Объяснили, понял!) Должен знать, что использую, потому и спросил!
А мануал от Иры почитаю)
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
14.04.2011, 00:20 #23
Цитата Сообщение от obZen Посмотреть сообщение
Если прокрутить окно вниз и вернуться обратно, изображение стирается...
это фишка Виндос система не должна запоминать что нарисовано в окне. окно само дожно себя перерисовывать.
для этого ему посылается сообщение WM_PAINT. оно посылается когда изменился размер, окно перекрыто полностью или частично.....
Но приходит ли оно консоли????
по моему тебе проще создать GUI окно и не мучатся
там все логичней
0
Olchik
21 / 21 / 3
Регистрация: 31.07.2009
Сообщений: 133
23.04.2011, 13:59 #24
Есть необходимость сделать массив Point неограниченным (но конечным). Как задавать ограниченный, я знаю, н-р, вот так
C++
1
2
3
4
5
6
7
8
array <Point>^ points =
            {Point(100,200),//a
            Point(120,150),//b
            Point(150,100),//c
            Point(162.5,150),//d
            Point(175,175),//e
            Point(200,200),//f
            Point(125,375)};//g
но он ограничен, а мне надо от 1 до n точек, для того чтоб построить по ним график с помощью
C++
1
>DrawCurve(anyPen,anyPointMas);
Подскажите, плз, как это сделать
работаю в c++, crl, windows form application.
p.s. не стала создавать новую тему, ибо те, кто писал ответы в этой, наверняка знают как это можно реализовать.
p.p.s. рисовать графики именно там, и именно с помощью массива точек и DrawCurve - идея не моя, а преподавателя - хочет, чтоб так ему сделали
0
ithyphallic
14 / 14 / 1
Регистрация: 27.10.2012
Сообщений: 141
09.11.2013, 16:33 #25
Цитата Сообщение от obZen Посмотреть сообщение
Возникла необходимость нарисовать линию по координатам.
Есть ли в С++ ф-я, подобная ф-ии line в Pascal? Код Pascal1
line (x, y, x2, y2);
А вот мне нужно именно так, как было описано в начале темы. Нужно нарисовать горизонтальную линию, состоящую из большого количества маленьких отрезков. И очень часто менять левый и правый конец каждого отрезка по координате Y. В Visual Basic это было элементарно - там был объект Line со свойствами x1, y1, x2, y2, который можно было просто разместить на форме. Неужели в C++ нельзя так же просто это сделать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 16:33
Привет! Вот еще темы с ответами:

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

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

Рисование линий в формах - Visual C++
Здравствуйте! Изучала C/C#/C++ еще на 2м курсе, и теперь совсем забыла некоторые вещи... Вот сейчас не могу найти, как конкретно...

TImage:рисование линий - C++ Builder
проблема такого характера: 1)нужно с помощю мыши нарисовать линию. 2)высчитать длину линии в пикселях Подскажите как это...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2013, 16:33
Ответ Создать тему
Опции темы

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