Рисование линий

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Рисование линий

Сообщение XairOn » 17.03.2005 (Чт) 9:32

Здравствуйте, вопрос мой такой: мне нужно нарисовать линию... да не просто линию, а штриховую (к примеру)... это я знаю как делается, создаю перо (CreatePenIndirect), указываю тип линий: PS_DASH, это работает только когда ширина линий равна 1 пиксель, если устанавливаю ширину 2 или больше, линия получается сполшная... а как можно сделать, что бы при любой ширине линий я мог бы выбирать её тип (сплошная, штриховая, штрихпунктирная и т.д.) ???

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 17.03.2005 (Чт) 11:32

При повышении толщины промежутки закрываются.

Выход:
Рисуй сам.
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 17.03.2005 (Чт) 11:48

KDima писал(а):При повышении толщины промежутки закрываются

Вобщем-то именно это я и сказал в первом сообщении
Рисуй сам

Это интересно как??? Хотя бы один пример, если можно?!

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 17.03.2005 (Чт) 12:07

Ручками в пейнте! :)

Алгоритм.

1. Линия делится на промежутки
Берём два вектора.
Один - что закрашиваем.
Другой - нет.
2. Чередуем их.

:roll:
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 17.03.2005 (Чт) 13:18

Ах если бы всё было так просто... для прямых линий твой метод ещё может быть и сгодится, а вот если мне например нужно границу у эллипса штрихпунктирную нарисовать... тут уже так просто не отделаешься.

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 17.03.2005 (Чт) 13:43

Каждой линии - свой алгоритм.
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 17.03.2005 (Чт) 16:38

KDima писал(а):Каждой линии - свой алгоритм.
Ага, и генерация нового алгоритма для каждой новой линии в реалтайме :wink:

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 17.03.2005 (Чт) 17:16

KDima писал(а):Каждой линии - свой алгоритм

Это у тебя такие шутки своеобразные.. да? Ты представь себе, что есть 5 типов линий (по крайней мере апи позволяют рисовать 5 типов линий определенных константами)... и ещё куча разных геометрических фигур... допустим, что у меня их будет 3... вот и прикинь какое число сочетаний будет из 3-ех по 5... 15.. правильно, это по-твоему 15 алгоритмов писать придется, я уж молчу о том какие это алгоритмы зверские будут... хотелось бы попроще как-нибудь, я думал, что всё-таки можно, как-нибудь апями обойтесь для решения этой проблемы... но всё больше убеждаюсь, что так не получится :-(...

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 17.03.2005 (Чт) 18:06

А ты что хотел?
А если бы ты прогу писал на АСМе? под ДОС? :wink:
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 17.03.2005 (Чт) 18:58

ну на асме, графический редактор (даже самый простой) у меня к счастью ума не хватит писать :-) ... но дело-то не в этом... даже если как ты говоришь алгоритмы на каждый случай придумывать, вот как ты себе представляешь алгоритм рисования пунктирной линии обрамляющей эллипс??? Конечно как-то его можно написать, но я думаю, это за рамками моего понимания???

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 17.03.2005 (Чт) 19:05

Ну это-то фигня... Через x(t),y(t), и чередуешь интервалы t...

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 17.03.2005 (Чт) 19:14

Зато какой кайф внутри, кода такой алгоритм написал! Программистом-мазахистом тоже иногда полезно быть! :lol: :lol:

Да и вообще, все фигуры (и кривые и эллипсы тоже) можно разбить на элементарные отрезки. Так что задача в том, чтобы замутить один алгоритм - рисования пунктирной прямой, а другие алгоритмы - используют первый для рисования более сложных фигур... :lol:

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 17.03.2005 (Чт) 23:45

ArcanoidНу это ты уже подзагнул... Как это ты, интересно, собрался использовать алгоритм рисования прямой для рисования окружности?

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 18.03.2005 (Пт) 9:13

:!:
Если вспомнить математику, окружность - это N-угольник, где N стремится к бесконечности. А если окружность разбить на 1000 равных частей, то отрезки, образуемые ими, будут почти прямыми. Их выпуклостью можно пренебречь, т.к. монитор всёрно её не покажет 8)
Даже если вспомнить OpenGL или DX, то любая сфера рисуется треугольниками :!:

надеюсь, теперь понятно :?:

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 18.03.2005 (Пт) 11:30

Господа, господа... вы что-то разошлись... такие советы я тоже мог бы раздавать налево и направо... в одном из более ранних сообщений, я говорил, что у меня пока что ума на такое не хватает... вы можете на конкретном примере продемонстрировать свои догадки по этому поводу? :?: :?: :?:

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.03.2005 (Пт) 13:30

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

Костя111
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.03.2005 (Пт) 14:59

Сообщение Костя111 » 18.03.2005 (Пт) 15:39

Лично мне кажеться что если делать по тапорному(по другому я ПОКА не умею) \ бы делал через функцию и строил бы по точкам.... извините за маразм... :lol:

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 18.03.2005 (Пт) 15:49

Костя111 писал(а):...через функцию и строил бы по точкам

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

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 19.03.2005 (Сб) 13:30

Интересно, как люди хотят написать фотошоп, не используя в проекте и половины функций из библы mozg32.dll ?! :D :D (Она лежит по адресу: C:\Голова\Мозг\System\mozg32.dll) :wink: :wink:

:idea:
Рисует эллипс с центром в точке {CenterX, CenterY}, Width и Height - ширина и высота эллипса, G - отступ обрамления эллипса наружу
Код: Выделить всё
Const PI As Double = 3.14
Sub PaintEllipse(CenterX As Single, CenterY As Single, Width As Single, Height As Single, G As Single)
    Dim R As Single, A As Single
    Dim X As Single, Y As Single, oldX As Single, oldY As Single, iX As Single
    Dim beta As Double 'Угол касательной к эллипсу
   
    R = Width / 2 'Радиус эллипса
    A = Height / Width 'Кэффициент сплюснутости эллипса по Y
   
    'Рисуем эллипс
    On Error Resume Next
    oldX = -R: oldY = 0
    For iX = -R + 1 To R + 1 Step 1
        Y = A * Sqr(R ^ 2 - iX ^ 2) 'Находим текущую Y
       
        'Рисуем линию из предыдущей точки до текущей
        Line (CenterX + oldX, CenterY + oldY)-(CenterX + iX, CenterY + Y)
        Line (CenterX + oldX, CenterY - oldY)-(CenterX + iX, CenterY - Y)
       
        'Запоминаем текущ. координаты, чтобы продолжить линию в следущем витке
        oldX = iX: oldY = Y
    Next
   
    'Рисуем границу
    On Error Resume Next
    oldX = -R - G: oldY = 0
    For iX = -R + 1 To R + 1 Step 1
        Y = A * Sqr(R ^ 2 - iX ^ 2) 'Находим Y эллипса
        beta = Atn(-A * iX / Sqr(R ^ 2 - iX ^ 2)) 'Находим угол касательной (из выражения Tan(beta) = Y'(x) )
        Y = Y + G * Sin(beta + PI / 2) 'Y точки на линии границы
        X = iX + G * Cos(beta + PI / 2) 'X точки на линии границы
       
        'Рисуем линию из предыдущей точки до текущей
        Line (CenterX + oldX, CenterY + oldY)-(CenterX + X, CenterY + Y), RGB(255, 0, 0)
        Line (CenterX + oldX, CenterY - oldY)-(CenterX + X, CenterY - Y), RGB(255, 0, 0)
       
        'Запоминаем текущ. координаты, чтобы продолжить линию в следущем витке
        oldX = X: oldY = Y
    Next
   
    On Error GoTo 0
End Sub

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 19.03.2005 (Сб) 13:59

Спасибо тебе большое Arcanoid... не совсем то, что было нужно, но тем не менее... ты в своем ответе зашел гораздо дальше чем все остальные... :wink: только умничать так не стоит по этому поводу :wink:

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 19.03.2005 (Сб) 13:59

А когда-то в ку-басике всё решалось простой хексовой маской :roll:
Да, вот времена были :roll:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 19.03.2005 (Сб) 14:05

XairOn, уже и шутнуть низя?!

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 19.03.2005 (Сб) 19:23

Arcanoid писал(а):XairOn, уже и шутнуть низя?!

Да шути ради бога :D :D :D

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 19.03.2005 (Сб) 21:26

Вот мой способ :lol:
нужно конечно сделать поправку
круг правильно рисуется только во 2 и 4 четверти

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.03.2005 (Сб) 21:31

Если нужно обеспечить пунктирность любой линии, то мне кажется лучше сохранять операции в WMF/EMF в памяти и рисовать из него.
Lasciate ogni speranza, voi ch'entrate.

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 19.03.2005 (Сб) 23:09

XairOn писал(а):... не совсем то, что было нужно, но тем не менее...


А что нужно-то? Вроде ты про обрамление эллипса и спрашивал... :roll:

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2005 (Вс) 7:36

Arcanoid писал(а):А что нужно-то? Вроде ты про обрамление эллипса и спрашивал...

Я спрашивал не просто про обрамление, а про пунктирное обрамление, твой пример довольно интересный, но он рисует 2 эллипса (по одному и тому же алгоритму) один на расстоянии G от другого... если бы мне именно это было нужно, я бы просто воспользовался Ellipse из АПИ...

2 Bonesnapper, тебе как обычно спасибо большое, как раз вот это мне и нужно было... осталось только заставить его работать на всем PictureBox'е... :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34

    TopList