Помогите МНЕ!!!!

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

Помогите МНЕ!!!!

Сообщение Бяка » 21.11.2005 (Пн) 3:59

Люди помоготе построить прямую линию между двумя точками!

кпримеру есть поле 20х20
Picture1.Scale (0, 0)-(20, 20)
и две точки
Picture1.Line (Int(X1), Int(Y1))-(Int(X1) + 1, Int(Y1) + 1), 0, BF
и
Picture1.Line (Int(X2), Int(Y2))-(Int(X2) + 1, Int(Y2) + 1), 0, BF
пусть будут X1=3;Y1=5 и X2=18;Y2=16
Помогите мене построить между ними прямую!
массив точек (путь) сохранить в R(Х,Y)

Помогите мене построить между ними прямую!

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 21.11.2005 (Пн) 6:52

Прямая по двум точкам это решение системы:
Y=K*X+B Для двух известных точек
K=(Y2-Y1)/(X2-X1)
B=Y1-K*X1

Получили нужные числа, ставим их в уравнение прямой и рисуем.
В цикле по X
Y=20/2-(K*X+B)

PS Стоит рассмотреть случай вертикальной линии отдельно, чтоб не получить деления на нуль.

PPS А вообще в ТАК названную тему отвечать не особо тянет. Поскромнее бы и посодержательнее.

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

Сообщение alibek » 21.11.2005 (Пн) 9:12

GAGArin писал(а):PS Стоит рассмотреть случай вертикальной линии отдельно, чтоб не получить деления на нуль.

Да нет, просто уравнение прямой нужно составить в параметрическом виде, тогда деления на ноль не будет как класса.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 21.11.2005 (Пн) 10:54

Alibek, не напомнишь?

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

Сообщение alibek » 21.11.2005 (Пн) 11:17

Неа, точно не помню :)
Что-то типа a*x+b*y+c=0
Lasciate ogni speranza, voi ch'entrate.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 21.11.2005 (Пн) 15:07

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

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 23.11.2005 (Ср) 0:36

для тех кому интерестно то вот
меня просвЯтили:
Код: Выделить всё
Private Type POINTAPI
        x As Long
        y As Long
End Type
Private Sub Command1_Click()
Dim X1 As Double, X2 As Double
Dim Y1 As Double, Y2 As Double
Dim L As Double, dX As Double, dY As Double
Dim R() As POINTAPI

X1 = 3: Y1 = 5
X2 = 18: Y2 = 16
Scale (0, 0)-(20, 20)

Line (Int(X1), Int(Y1))-(Int(X1) + 1, Int(Y1) + 1), vbRed, BF
Line (Int(X2), Int(Y2))-(Int(X2) + 1, Int(Y2) + 1), vbRed, BF

L = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)  'Расстояние между точками
dX = (X2 - X1) / L       'приращение по Х
dY = (Y2 - Y1) / L       ' -//-      по Y
ReDim R(0 To L)

For i = 0 To L
R(i).x = X1
R(i).y = Y1
Line (R(i).x, R(i).y)-Step(1, 1), 0, BF
X1 = X1 + dX
Y1 = Y1 + dY
Next i

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 23.11.2005 (Ср) 0:39

для тех кому интерестно то вот
меня просвЯтили:
Код: Выделить всё
Private Type POINTAPI
        x As Long
        y As Long
End Type
Private Sub Command1_Click()
Dim X1 As Double, X2 As Double
Dim Y1 As Double, Y2 As Double
Dim L As Double, dX As Double, dY As Double
Dim R() As POINTAPI

X1 = 3: Y1 = 5
X2 = 18: Y2 = 16
Scale (0, 0)-(20, 20)

Line (Int(X1), Int(Y1))-(Int(X1) + 1, Int(Y1) + 1), vbRed, BF
Line (Int(X2), Int(Y2))-(Int(X2) + 1, Int(Y2) + 1), vbRed, BF

L = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)  'Расстояние между точками
dX = (X2 - X1) / L       'приращение по Х
dY = (Y2 - Y1) / L       ' -//-      по Y
ReDim R(0 To L)

For i = 0 To L
R(i).x = X1
R(i).y = Y1
Line (R(i).x, R(i).y)-Step(1, 1), 0, BF
X1 = X1 + dX
Y1 = Y1 + dY
Next i

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 23.11.2005 (Ср) 0:40

для тех кому интерестно то вот
меня просвЯтили:
Код: Выделить всё
Private Type POINTAPI
        x As Long
        y As Long
End Type
Private Sub Command1_Click()
Dim X1 As Double, X2 As Double
Dim Y1 As Double, Y2 As Double
Dim L As Double, dX As Double, dY As Double
Dim R() As POINTAPI

X1 = 3: Y1 = 5
X2 = 18: Y2 = 16
Scale (0, 0)-(20, 20)

Line (Int(X1), Int(Y1))-(Int(X1) + 1, Int(Y1) + 1), vbRed, BF
Line (Int(X2), Int(Y2))-(Int(X2) + 1, Int(Y2) + 1), vbRed, BF

L = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)  'Расстояние между точками
dX = (X2 - X1) / L       'приращение по Х
dY = (Y2 - Y1) / L       ' -//-      по Y
ReDim R(0 To L)

For i = 0 To L
R(i).x = X1
R(i).y = Y1
Line (R(i).x, R(i).y)-Step(1, 1), 0, BF
X1 = X1 + dX
Y1 = Y1 + dY
Next i

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 23.11.2005 (Ср) 11:40

Да что ж так форум лагает :evil:
Задолбали одинаковые сообщения по 3 и более штук
Если всё делать своими ручками, они скоро отвалятся !

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 23.11.2005 (Ср) 15:22

для тех кому интерестно то вот
меня просвЯтили:

Эээ... Не могу понять чем рисование сегментами лучше нежели вывод функции, кстати вроде как очень простой... :shock: Вот что я с ошибкой написал (только сейчас заметил) так это рисование линии. Проще посчитать игреки двух крайних точек (x=0 и x=20) И нарисовать линию, а не маяться с точками.

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

Ну и еще, может я что-то путаю, но если в VB остался line, то должен быть и PSET Если уж так хочеться по точкам юзай его (а не прямоугольник с диагональю 1)

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 02.12.2005 (Пт) 0:28

см оператор Scale (0, 0)-(20, 20)

PSET и просто line непокатят ( точка должна быть размером 20х20 пикселей к примеру и ктомуже квадраная)

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 02.12.2005 (Пт) 0:59

Бяка писал(а):точка должна быть размером 20х20 пикселей к примеру и ктомуже квадраная

Я просто в восторге. Занятные такие точечки со стороной 0,7см (по крайней мере у меня) :lol:

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 02.12.2005 (Пт) 22:48

то я "размером 20х20 пикселей" к примеру говорю. непридерайси к словам :P


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

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 127

    TopList  
cron