С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Insider246
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 119

Нарисовать линию точками

16.06.2016, 21:09. Показов 4383. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно нарисовать линию канвасом из центра до любой точки, допустим центр = (500, 500), второй конец = (100, 100); НО без LineTo, а в цикле с помощью точек Canvas->Pixels[x][y]. Прошу помощи.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2016, 21:09
Ответы с готовыми решениями:

Как нарисовать линию!
Как мне на форме нарисовать линию, что-бы указать например (10,40,30,20)! Короче как указать начало линии в определенных местах и конец в...

нарисовать прямую линию
Как с++ builder нарисовать прямую линию (напобобие как это делалось в paint)! Помогите плиз, дайте код!

GDI+ нарисовать линию
Замучился с этим GDI+ уже. Решил начать с простого. Нарисовать линию на канве пустой формы. Пишу: void __fastcall...

13
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 03:19
Insider246,
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
        for(int x=100; x<=500; x++){
        Form1->Canvas->Pixels[x][500]=clBlue;}
}
}
Это если делать по X, если по Y, то меняешь ОсьY.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.06.2016, 03:45
Лучший ответ Сообщение было отмечено Insider246 как решение

Решение

http://www.mathelp.spb.ru/book1/line_on_plane.htm
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
int func(int x, TPoint a, TPoint b)
{
  int res;
  if (b.x != a.x)
    res = a.y + 1.0 * (b.y - a.y) / (b.x - a.x) * (x - a.x);
  else
    res = a.y;
  return res;
}
//---------------------------------------------------------------------------
int max(int a, int b)
{
  return a > b ? a : b;
}
//---------------------------------------------------------------------------
int min(int a, int b)
{
  return a < b ? a : b;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TPoint point1 = TPoint(ClientWidth / 2, ClientHeight / 2), point2 = TPoint(100, 100);
  int i, max_x = max(point2.x, point1.x), min_x = min(point2.x, point1.x),
      max_y = max(point2.y, point1.y), min_y = min(point2.y, point1.y);
  if (point2.x != point1.x)
    for (i = min_x; i <= max_x; i++)
      Canvas->Pixels[i][func(i, point1, point2)] = clRed;
  else
    for (i = min_y; i <= max_y; i++)
      Canvas->Pixels[point1.x][i] = clRed;
}
Миниатюры
Нарисовать линию точками  
1
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 03:48
gunslinger, так а чем мой способ плохой?
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.06.2016, 03:49
А ты им наклонную линию нарисуешь?
0
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 03:58
gunslinger, v
C++
1
2
3
4
5
oid __fastcall TForm1::Button1Click(TObject *Sender)
{
    for(int x=100; x<=500; x++){
        Form1->Canvas->Pixels[x][x+2]=clBlue;}
}
Мы же работаем с ОсьюX, так что ОсьY можно хоть в ручную менять
Миниатюры
Нарисовать линию точками  
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.06.2016, 04:00
А для произвольных точек?
Например, от точки (100, 0) до точки (500, 768), но только в общем случае, чтобы не подгонять результат под каждый конкретный вариант?
1
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 04:02
gunslinger, сейчас попробую реализовать
0
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 04:10
gunslinger, если вводить 2-ой for, то будет такая "дичь" =) Так что только через переменные, которые вводить в Edit компоненте )
Миниатюры
Нарисовать линию точками  
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.06.2016, 04:15
В моем случае тоже не все идеально.
Если диапазон изменения x мал, то даже изменение (приращение) параметра i на малые величины (если тип i - float) приведет к следующему:



От варианта использования двойного цикла отказался почти сразу, решил, что это костыль.
Хотя если кто сможешь реализовать нормально такой способ, то будет молодец.
0
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 04:19
gunslinger, я уже все варианты перепробовал. Потом догадался почему не реально. Линии выстраиваются по ОсьX и ОсиY, не от начало координаты ОсьX и концовкой ОсьY, а заполняют эти диапазоны и получается мы просто чертим фигуру, либо квадрат, либо прямоугольник
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.06.2016, 04:25
Там возможно нужно все-таки через одиночный цикл делать, но не уверен.
Если получится сделать, выложу результат.

По поводу бага - я уже туплю, нужно просто заменить int на float (или double) там, где требуется:
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
float func(float x, TPoint a, TPoint b)
{
  float res;
  if (b.x != a.x)
    res = a.y + 1.0 * (b.y - a.y) / (b.x - a.x) * (x - a.x);
  else
    res = a.y;
  return res;
}
//---------------------------------------------------------------------------
int max(int a, int b)
{
  return a > b ? a : b;
}
//---------------------------------------------------------------------------
int min(int a, int b)
{
  return a < b ? a : b;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TPoint point1 = TPoint(ClientWidth / 2, ClientHeight / 2), point2 = TPoint(300, 100);
  int max_x = max(point2.x, point1.x), min_x = min(point2.x, point1.x),
      max_y = max(point2.y, point1.y), min_y = min(point2.y, point1.y);
  float i, step = 0.01;
  if (point2.x != point1.x)
    for (i = min_x; i <= max_x; i += step)
      Canvas->Pixels[i][func(i, point1, point2)] = clRed;
  else
    for (i = min_y; i <= max_y; i += step)
      Canvas->Pixels[point1.x][i] = clRed;
}
И будет рисоваться нормально.
Миниатюры
Нарисовать линию точками  
1
 Аватар для crazyprog
5 / 6 / 3
Регистрация: 13.02.2016
Сообщений: 91
17.06.2016, 04:27
gunslinger, ну так уже пол 5-го утра ))) в РБ такое время уже )) А мне ещё диплом пилить ) Вот поц обрадуется когда войдёт на свою запись )
0
 Аватар для Insider246
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 119
17.06.2016, 12:17  [ТС]
Это точно, спасибо всем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2016, 12:17
Помогаю со студенческими работами здесь

Нарисовать на Canvas цепную линию
как нарисовать с помощью канваса в билдере цепную линию? ( y=a*ch(x/a) )

Нарисовать линию по клику мышкой
Помогите пожалуйста, нужно нарисовать линию от одной точки к другой и от другой к третей и тд. по килику мышкой.

Как нарисовать линию в Builder.
Помогите, пожалуйста. Как нарисовать линию в Builder.

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

Нарисовать полигональную линию в Excel средствами C++ Builder
Необходимо нарисовать полигональную линию в Excel. Задача минимум, хотя бы повторить пример MSDN для Visual Basic. Вот...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru