По-моему полигоны?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

По-моему полигоны?

Сообщение Sirik » 24.01.2005 (Пн) 14:33

Есть набор точек (x,y)
Если я рисую их на Picture и соединяю их линиями, то получается не очень краисвая картинка: углы стыка линий резковатые (если можно так выразится)

Как можно их содинить "красиво"? Краем уха слышал, что можно использовать полигоны. Но как? Дайте пример

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2005 (Пн) 14:37

:scratch:

Если моя правильно понять твоя, то тебе нужна Private Declare Function PolyBezier Lib "gdi32.dll" (ByVal hdc As Long, ByRef lppt As POINTAPI, ByVal cPoints As Long) As Long
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 15:37

Да, можно и эту функцию использовать. Но использую вот эту PolylineTo

Появился следующий вопрос: в Picture я поставил свой маштаю через Scale. И теперь если хочу нарисовать определённое количество точек ни чего не получается: простым методом PSet всё ок, но только не PolyLineTo. Я так понимаю, что надо использовать какие-то коефициенты, но какие и где их взять?

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

Сообщение alibek » 26.01.2005 (Ср) 15:47

Рассчитывать и умножать. Или использовать методы PictureBox.ScaleX/ScaleY для перерасчета.
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 15:58

Хорошо.
Допустим я установил маштаб так
Picture.Scale(3,74)-(431,-87)

Рисую 5 точек методом Pset всё ок. "Загяняю" координаты точек в массив и вызываю PolyLineTo получается следующее: русунок смещён вверх+приплюснуть.
Как расчитать необходимые коефициенты?

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

Сообщение alibek » 26.01.2005 (Ср) 16:07

PictureBox.ScaleX(12, PictureBox.ScaleMode, vbPixels) - получить координаты 12 в пикселах.
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 16:21

Что-то я ничего не понимаю :oops:

Вот тут я пример выложу. Какие надо поставить координаты первой точки (p(0).x=?,p(0).y=?), чтобы вершина треугольника была к круге (центр круга 10,10)
Вложения
test_p.zip
(1.43 Кб) Скачиваний: 19

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.01.2005 (Ср) 16:40

Код: Выделить всё
    p(0).X = Picture1.ScaleX(10 - Picture1.ScaleLeft, vbUser, vbPixels): p(0).Y = Picture1.ScaleY(10 - Picture1.ScaleTop, vbUser, vbPixels)
    p(1).X = Picture1.ScaleX(100 - Picture1.ScaleLeft, vbUser, vbPixels): p(1).Y = Picture1.ScaleY(100 - Picture1.ScaleTop, vbUser, vbPixels)
    p(2).X = Picture1.ScaleX(50 - Picture1.ScaleLeft, vbUser, vbPixels): p(2).Y = Picture1.ScaleY(150 - Picture1.ScaleTop, vbUser, vbPixels)
    p(3).X = Picture1.ScaleX(10 - Picture1.ScaleLeft, vbUser, vbPixels): p(3).Y = Picture1.ScaleY(10 - Picture1.ScaleTop, vbUser, vbPixels)
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 16:44

Тёмич спасибо.
Вот только объясни почему минус?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.01.2005 (Ср) 16:46

Расстояние от точки до левого края - это (Xточки - Xлевого_края).
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 16:49

Конечно!
Что-то я сегодня торможу!

И ещё один вопрос: если я использую функцию PolyLine или PolyBezier, как мне задать цвет маркера и тип?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.01.2005 (Ср) 16:57

Думаю, никак :-?
Рисуй маркеры отдельно.
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 17:14

Ок, я так и думал, но надеялся на лучшее

А как мне задать цвет и тип линий когда использую эти функции?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.01.2005 (Ср) 17:17

Выбери в девайсконтекст нужный Pen.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.01.2005 (Ср) 17:20

1.
GSerg писал(а):Выбери в девайсконтекст нужный Pen.

"На пальцах" можешь объяснить?

2. С функцие PolyLine - всё понятно, а вот с PolyBezier - нет. Я так понимаю, что для этой функции необходимо кратное 3 кол. точек и ещё что-небудь в этом роде?! Например, для 10 точек работает, а для 11 не хочет

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.01.2005 (Ср) 17:25

1. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As PenStyle, ByVal nWidth As Long, ByVal crColor As Long) As Long


2. cPoints
[in] Specifies the number of points in the lppt array. This value must be one more than three times the number of curves to be drawn, because each Bézier curve requires two control points and an endpoint, and the initial curve requires an additional starting point.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 27.01.2005 (Чт) 12:03

2 GSerg
А теперь по-русски. Что-то проблеммы последнее время с анлг.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.01.2005 (Чт) 13:15

Нужно три точки на каждый сегмент кривой, плюс ещё одна начальная.
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 27.01.2005 (Чт) 13:18

Это я понял, что нужно три точки. Т.е. получается, что если у меня есть 11 точек, то линию провести не удасться?

И еще вопросик как пользоваться функцией CreatePen?
Мне надо на PictureBox нарисовть методом Line линии шрих-пунктриром+разными цветами

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.01.2005 (Чт) 13:22

1. Если у тебя 11 точек, то функции ты должен передать 10*3+1 = 31 точку.

2. Сейчас сделаю пример...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.01.2005 (Чт) 13:34

Пример для красного штрих-пунктира:
Код: Выделить всё
    Dim p(3) As POINTAPI, hPen As Long, hMyPen As Long
   
    Picture1.Scale (-10, 100)-(400, -100)
    Picture1.Circle (10, 10), 10
   
    p(0).X = Picture1.ScaleX(10 - Picture1.ScaleLeft, vbUser, vbPixels): p(0).Y = Picture1.ScaleY(10 - Picture1.ScaleTop, vbUser, vbPixels)
    p(1).X = Picture1.ScaleX(100 - Picture1.ScaleLeft, vbUser, vbPixels): p(1).Y = Picture1.ScaleY(100 - Picture1.ScaleTop, vbUser, vbPixels)
    p(2).X = Picture1.ScaleX(50 - Picture1.ScaleLeft, vbUser, vbPixels): p(2).Y = Picture1.ScaleY(150 - Picture1.ScaleTop, vbUser, vbPixels)
    p(3).X = Picture1.ScaleX(10 - Picture1.ScaleLeft, vbUser, vbPixels): p(3).Y = Picture1.ScaleY(10 - Picture1.ScaleTop, vbUser, vbPixels)
   
    hMyPen = CreatePen(PS_DASHDOT, 1, vbRed)
    hPen = SelectObject(Picture1.hdc, hMyPen)
   
    Polyline Picture1.hdc, p(0), 4
   
    SelectObject Picture1.hdc, hPen
    DeleteObject hMyPen


Декларации сам вставишь?
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 27.01.2005 (Чт) 13:41

Тёмыч, за пример спасибо!

Насчёт 1 вопроса: какие именно 31 точки?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.01.2005 (Чт) 13:52

11, через которые линия проходит, и ещё 20 направляющих, которые бы указывали, как ей изгибаться.
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 27.01.2005 (Чт) 13:56

Дело ясное, что дело тёмное.

Ничего не понял, больше запутался.
У тебя пример работы этой функции есть?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.01.2005 (Чт) 14:02

Изображение


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

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

Сейчас этот форум просматривают: Google-бот и гости: 9

    TopList