Два вопроса про Line

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

Два вопроса про Line

Сообщение burik » 23.10.2007 (Вт) 17:45

Здравствуйте!

Мне потребовалось вычертить график некоторой функции и в связи с этим возникло два вопроса:
1. Все работало нормально, пока при вычерчивании одной из функций не вылезла ошибка "Run-time error '6': Overflow" в строке с методом Line.
Код: Выделить всё

Private Sub ReDrawGraph(ByVal strExp As String)
Dim cX As Single, cY As Single

    CurrentX = -countX
    CurrentY = Eval(Replace(strExp, "x", CStr(CurrentX * pi)))
   
    i = (-countX / 2) / px
    While i <= (countX / 2) / px
        cX = i * px
        cY = Eval(Replace(strExp, "x", CStr(cX * pi)))
        Line -(cX, cY), &HC00000 '<<<<<<<- тут возникает ошибка
        i = i + 15
    Wend
End Sub
'Значения cX и cY в момент ошибки:
'cX = -5,5
'cY = 4,432354E+08


Почему возникает такая ошибка? Может в методе Line есть какие-либо ограничения на координаты?

2. Как можно сгладить линию?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 23.10.2007 (Вт) 19:44

1. Как минимум можно ScaleMode выставить в пикселях, а не твипах - диапазон значений расширится в 15 раз.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.10.2007 (Вт) 20:37

burik
2. "Скруглить" или сгладить?
Если скруглить, тогда, юзая сплайны, кривые Безье или что-либо в этом роде.
Если именно сгладить - юзая алгоритм Ву.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 23.10.2007 (Вт) 20:54

burik
2. "Скруглить" или сгладить?
Если скруглить, тогда делай точечный график.
Если сгладить, то как сказал Хакер, а сам не знаю.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.10.2007 (Вт) 20:57

Денис
Если функциональная зависимость слишком сложная, то на мой взгляд, лучше использовать сплайны, нежели просчитывать лишний раз функцию для каждой точки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 24.10.2007 (Ср) 17:54

Antonariy, у меня пользовательская система координат. И вообще я не совсем понимаю чем это поможет: координата Y зависит от координаты X и при изменении системы координат просто изменятся значения обоих. Я, наверное, чего-то не понимаю?

Нужно именно сгладить.. Щас попробую алгоритм By поискать, спасибо.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2007 (Ср) 18:59

Вот именно, что изменятся значения. Line принимает, если мне не изменяет склероз, значения single-диапазона. Где-то значение одного из аргументов выходит за его границы, а пересчет в более крупных единицах уменьшит эти значения, и они пролезут в аргументы.
Лучший способ понять что-то самому — объяснить это другому.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 25.10.2007 (Чт) 14:07

Но ведь cX и cY объявлены As Single, так как в них может быть значение вне диапазона Single. Разве при записи в переменную значения, которое вне диапазона типа переменной, оно не округлится (или выскочит Overflow в момент присваивания)? Например:

Код: Выделить всё

Dim a As Integer, b As Byte

a = 5.345   'Насколько я понимаю в a запишется 5
b = 280     'Тут (как я понимаю) вылезет Overflow
'P. S. Проверил. Все именно так и происходит.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 25.10.2007 (Чт) 14:30

burik
А ты на других языках программировал?
Перечисли?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 25.10.2007 (Чт) 14:50

Денис, не совсем понял как этот вопрос относится к теме?
Вобщем-то на VB(VBScript) и Pascal(школьные олимпиады). Можно еще посчитать JavaScript, PHP.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 25.10.2007 (Чт) 22:30

burik
Все очень просто. Дельфи не будет ничего округлять - сразу выдаст ошибку.
Не дай бейсику обмануть тебя. Не подсовывай ему заведомо ошибкоопасные (надеюсь понятно) данные.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 25.10.2007 (Чт) 22:50

Денис, спасибо конечно за пояснение :) , я в курсе что Delphi не округляет, но говорим мы о VB, который округляет. Да и вопрос не втом округляет он или нет. Вопрос такой: Почему возникает ошибка? (выше приведен код и указана строка с ошибкой). Antonariy говорит что это может возникнуть из-за того, что я передаю в метод Line координаты, лежащие вне диапазона Single, но я передаю туда не просто значения, а переменные типа Single, в которых (насколько я понимаю) не может храниться значение вне диапазона Single.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.10.2007 (Чт) 23:40

burik
Дело в том что Денис просто не может сдержаться, и не вставить какой-нибудь комментарий по любому поводу. Он, правда, говорит полную чушь насчёт округлений.

VB не округляет, VB конвертирует один тип переменной в другой. Всегда конвертирует, при любом присваивании. При присваивании 123 строковой переменной, конвертирует. И точно также при присванивании int-числа байт-переменной - тоже конвертирует.

Кладёт в ecx число, и вызывает рантайм-неSTDCALL-функцию _vbaUI1I2

Та в свою очередь сравнивает переданное integer-число с диапазоном Byte (0-255):



PUSH EBX
MOV BX,CX
CMP BX,0FF ; вот тут и происходит сравнивание
JBE SHORT MSVBVM60.660E0EA0 ; Если всё в порядке, то управление передаётся на зелёный код:
PUSH 6
CALL MSVBVM60.660CDDB3

MOV AL,BL
POP EBX
RETN




(А вот красный код генерирует ошибку Overflow, если integer-число выше 255).

В дельфи АФАИК нет вариант-типов и неявных преобразований типов, и поэтому там совершенно другая система.

Бейсик не обманывает тебя. Бейсик просто избавляет тебя от тучи лишних преобразований.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 26.10.2007 (Пт) 10:08

Дело в том что Денис просто не может сдержаться, и не вставить какой-нибудь комментарий по любому поводу.
Оказывается, это заразно :roll:

burik
Ага, не заметил, что Single...
Line -(cX, cY), &HC00000 - сам так не писал, но похоже (поправь, если ошибаюсь), что здесь рисуется линия от текущей точки до точки со смещением cX, cY. Если так, то возможно результирующая координата таки выходит за рамки Single, и Line где-то внутри себя не может ее посчитать. И мое предложение остается в силе.
Лучший способ понять что-то самому — объяснить это другому.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 26.10.2007 (Пт) 12:51

Antonariy, нет линия рисуется из текущей точки в точку с координатами cX, cY. Чтобы линия рисовалась со смещением нужно писать Line -Step(cX, cY), &HC00000.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Re: Два вопроса про Line

Сообщение Al Khamid » 28.10.2007 (Вс) 22:27

Все мои посты - полный бред. Удалите меня из форума.
Последний раз редактировалось Al Khamid 07.11.2007 (Ср) 10:24, всего редактировалось 1 раз.
"Время пришло..." ©

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 28.10.2007 (Вс) 22:52

Al Khamid, да, так нужно. Просто графики разные есть, например график y=tg(x). Но разве Line не может работать с координатами, лежащими вне экрана?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.10.2007 (Вс) 23:27

Al Khamid писал(а):Если Y=443 235 400, то в чем не выставляй ScalMode, график чертится где-то далеко за пределами экрана. Ты уверен, что это так нужно?



Al Khamid про меня писал(а):Такая "точность" вызывает подозрения в отсутствии практики. Конечно могут быть исключения: низкоуровневое программирование или работа в каком-нибудь "Атласе" над каким-нибудь (чур меня) ЕГАИСом...

Есть подозрение в отсутсвии практики. Потому как очень странным выглядит то, что тебе не пришла в голову мысль о том, что автор мог установить свой произвольный масштаб.

Запусти же
Код: Выделить всё
Private Sub Form_Load()
Me.Scale (0, 0)-(500000000, 500000000)
Me.DrawWidth = 10
End Sub

Private Sub Form_Paint()

Me.PSet (443235400, 443235400), vbBlue
End Sub

и узри, что твоя придирка не имеет под собой не малейшего основания.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 29.10.2007 (Пн) 11:48

Все мои посты - полный бред. Удалите меня из форума.
Последний раз редактировалось Al Khamid 07.11.2007 (Ср) 10:24, всего редактировалось 1 раз.
"Время пришло..." ©

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 29.10.2007 (Пн) 16:29

Al Khamid писал(а):Хакер, про "свой произвольный масштаб" я не учел потому, что внимательно читал и код и каменты и сделал вывод, что автор этим еще не пользуется.

Однако вот мой второй пост (http://bbs.vbstreets.ru/viewtopic.php?p=6678917#6678917):
burik писал(а):Antonariy, у меня пользовательская система координат.
:D

Хотя твой вариант(с незначительными поправками) работает нормально :) . Но все же хотелось бы понять почему возникала эта ошибка..
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 29.10.2007 (Пн) 17:46

Все мои посты - полный бред. Удалите меня из форума.
Последний раз редактировалось Al Khamid 07.11.2007 (Ср) 10:23, всего редактировалось 1 раз.
"Время пришло..." ©

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 29.10.2007 (Пн) 20:47

Al Khamid

Просто открой любой справочник по VB для чайников и почитай про преобразование типов какие типы в какие преобразуются по умолчанию. И тебе всё станет ясно. Распечатай на листеке и повесь на стенку рядом с монитором чтобы всегда перед глазами было. :lol:
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 29.10.2007 (Пн) 21:12

Все мои посты - полный бред. Удалите меня из форума.
Последний раз редактировалось Al Khamid 07.11.2007 (Ср) 10:22, всего редактировалось 1 раз.
"Время пришло..." ©

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 29.10.2007 (Пн) 22:03

Al Khamid, Потомучто если написать так :


Код: Выделить всё
Dim a as long

a=clng(256)*clng(256)


или так:
Код: Выделить всё
a=clng(256)*256

или
Код: Выделить всё
a=256*clng(256)

то ошибки не будет.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.10.2007 (Пн) 23:00

А если написать Const As Long, то код будет выполнен быстрее, из-за отсутствия конвертаций.
Изображение

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 30.10.2007 (Вт) 1:20

Все мои посты - полный бред. Удалите меня из форума.
Последний раз редактировалось Al Khamid 07.11.2007 (Ср) 10:22, всего редактировалось 1 раз.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 30.10.2007 (Вт) 12:02

Al Khamid писал(а):netdemon, еще раз спрашиваю. При чем здесь преобразование типов?
Я разве где-то писал, что не знаю как это обойти? И что оно мне вообще нужно? Повторю: мне любопытно, почему так происходит, но не более.
Про другие такие приколы уже и боюсь писать.



Вот это сообщение от Хакера прочитай. Он уже давно ответил почему так происходит
Добавлено: 25.10.2007 (Чт) 23:40 Заголовок сообщения:
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.


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

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

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

    TopList