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

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

16.06.2016, 21:09. Показов 4407. Ответов 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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru