Внимание! Построение графиков в Visual Basic

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Внимание! Построение графиков в Visual Basic

Сообщение Millstone » 13.05.2004 (Чт) 10:53

Добрый день, пишу сейчас диплом на Visual Basic. И очень прошу совета!

Я вывожу график функции на экран. Проблема в том, что если задать
много точек для вывода, в какой-то момент наступает перегруз и
график перестаёт выводиться... Как бы подвисает программа. Есть ли
пути чтобы с этим бороться? Пока что я борюсь тем, что снижаю
количество шагов в цикле, но это плохой вариант, т.к. падает
точность прорисовки, что в моём случае довольно существенно. Большое спасибо!

:?: :?: :?: :?: :?:

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

Сообщение GSerg » 13.05.2004 (Чт) 10:54

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

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 13.05.2004 (Чт) 10:55

Form1.BackColor = &H80000009
DrawWidth = 2
Scale (-400000, 400000)-(400000, -400000)
Form1.ForeColor = &H0&
Line (-1000000, 0)-(1000000, 0)
Line (0, -1000000)-(0, 1000000)
Form1.ForeColor = &HFF&

deltaFi = pi * 3 / 180

Line (0, 0)-(0, 0)
rmax = 0

For Fi0 = 0.000013 To 2 * pi Step deltaFi

For Fi = 0.0000137 To 2 * pi Step 0.24351
r = Count_graf(Fi, Fi0) ' получаю число

If r > rmax Then
rmax = r
End If

Next

x = Cos(Fi0) * rmax
y = Sin(Fi0) * rmax
Line -(x, y)

rmax = 0

Next

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

Сообщение GSerg » 13.05.2004 (Чт) 11:00

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

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 13.05.2004 (Чт) 11:09

А polyline как функционирует? У меня пособие есть, но там про это ни слова ;) С массивом-то я как-нибудь справлюсь ;)

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

Сообщение GSerg » 13.05.2004 (Чт) 11:10

Чем больше я смотрю на этот код...
Дай Count_graf. И всё, что она требует. Если это немного.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 13.05.2004 (Чт) 11:13

Function Count_graf(Fi, Fi0)

' Ниже просто задаются параметры для формулы
psi = 36 * 2.57 * (Cos(Fi - Fi0) - 1)
F = Sin(psi) / psi
Fi01 = 3.00034
E = 300 * (10 ^ 3) * 60 * (10 ^ (-6))
G = 4000
sigma = 7
rp = 10000
Pp = 150 / 1000000
Pm = 10 ^ 38 / 1000000
psi1 = 36 * 2.57 * (Cos(Fi01 - Fi0) - 1)
F1 = Sin(psi1) / psi1

'формула
r = (E * G * sigma * (F ^ 4) / (16 * pi * pi * Pm + (4 * 3.14 * Pp * F1 ^ 2) / (rp ^ 2))) ^ (1 / 4)

Debug.Print r
Count_graf = r
End Function

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 13.05.2004 (Чт) 11:16


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

Сообщение GSerg » 13.05.2004 (Чт) 11:22

Две вещи я скажу.
Первое. Юзай Option explicit. Юзай Const. Уважай язык, в общем :)
Второе. Ты смотрел в Debug-то? Там значения микроскопические. А ты масштаб ставишь офигенный. Конечно не видишь ничего! Оно же всё в один пиксель укладывается, при таком-то масштабе.

Извиняюсь. Ошибся с одной константой. Точно ничего не увидел бы :) Но уже исправил.

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

Private Const PI As Double = 3.1415926

Private Sub Form_Load()
 
  Const DeltaFi As Double = PI * 3 / 180
   
  Dim Fi0 As Double, Fi As Double, rmax As Double, r As Double
  'Dim x As Double, y As Double
   
  Me.BackColor = vbActiveTitleBarText ' а не &H80000009
  Me.DrawWidth = 2
  Me.Scale (-400000, 400000)-(400000, -400000)
 
  Me.ForeColor = vbBlack 'а не 0&
  Me.Line (-1000000, 0)-(1000000, 0)
  Me.Line (0, -1000000)-(0, 1000000)
 
  Me.ForeColor = vbRed 'а не &hff
  Me.Line (0, 0)-(0, 0)
 
  For Fi0 = 0.000013 To 2 * PI Step DeltaFi
    rmax = 0
    For Fi = 0.0000137 To 2 * PI Step 0.24351
      r = Count_graf(Fi, Fi0) ' получаю число
      If r > rmax Then rmax = r
    Next
   
    Me.Line -(Cos(Fi0) * rmax, Sin(Fi0) * rmax)
  Next
End Sub

Private Function Count_graf(Fi As Double, Fi0 As Double) As Double
  Const Fi01 As Double = 3.00034
  Const G As Double = 4000
  Const E As Double = 300 * (10 ^ 3) * 60 * (10 ^ (-6))
  Const sigma As Double = 7
  Const rp As Double = 10000
  Const Pp As Double = 150 / 1000000
  Const Pm As Double = 10 ^ 38 / 1000000
 
  Dim psi As Double, psi1 As Double, F As Double, F1 As Double
 
  psi = 36 * 2.57 * (Cos(Fi - Fi0) - 1)
  F = Sin(psi) / psi
  psi1 = 36 * 2.57 * (Cos(Fi01 - Fi0) - 1)
  F1 = Sin(psi1) / psi1
 
  'формула
  Count_graf = (E * G * sigma * (F ^ 4) / (16 * PI * PI * Pm + (4 * 3.14 * Pp * F1 ^ 2) / (rp ^ 2))) ^ (1 / 4)
 
  Debug.Print Count_graf
End Function
Последний раз редактировалось GSerg 13.05.2004 (Чт) 11:30, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 13.05.2004 (Чт) 11:28

Виноват за язык ;) Никого не хотел обидеть... А значения там НЕ микроскопические. Если сделать шаг побольше - всё отображается. Спасибо за пример!

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

Сообщение GSerg » 13.05.2004 (Чт) 11:31

1,4392673426497E-08
3,0829430423595E-09
2,71637006438281E-09
9,81149171972115E-10
8,84882337788903E-10
5,87494738275291E-10
2,11645637401875E-10
4,4489997593483E-10
2,80218839975937E-10
2,41642914637926E-10
4,18995098315506E-10
4,08836542378418E-10
2,24235674299603E-10
3,98688648924968E-10
3,9104045746641E-10
2,5576967106988E-10
1,55181293380654E-10
6,38009439394095E-10
7,68140711075509E-10
8,41613348585279E-10
1,4332410021416E-09

Это сколько, по-твоему? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 13.05.2004 (Чт) 17:28

Тут проблема не в этом... Маленькие значения - это как раз нормально. Щас цифру одну изменил и выводится график на весь экран. Проблема в том, что он просчитает некоторое количество точек и с формы пропадает всё. А вместо курсора появляются часики, типа она задумалась... !!!!! А потом, когда она досчитает все остальные точки - на экране по-прежнему пустота... Я так понял, почитав ссылку, которую тут оставили, что свыше некоторого количества точек она вообще перестаёт на экран выводить??? Никак не пойму в чём дело ;(

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 13.05.2004 (Чт) 19:40

Насчет Polyline:
Код: Выделить всё
Private Type POINTAPI
        X As Long
        Y As Long
End Type
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long

В массив типов POINTAPI (Dim Points() As POINTAPI) Вставляешь все координаты точек, затем вызываешь
Код: Выделить всё
Polyline Me.hDC, Points(0), UBound(Points) + 1
Нет меня больше

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 13.05.2004 (Чт) 22:14

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

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 14.05.2004 (Пт) 11:09

Вот прямо у себя целиком скопировал. Просто посмотрите, пожалуйста, что получается. Щас попробую полилайн сделать...

Private Sub Command1_Click()

Const DeltaFi As Double = PI * 2 / 180

Dim Fi0 As Double, Fi As Double, rmax As Double, r As Double
Dim X As Double, Y As Double


Me.BackColor = &H80000009
Me.DrawWidth = 2
Me.Scale (-10000, 10000)-(10000, -10000)

Me.ForeColor = vbBlack
Me.Line (-10000, 0)-(10000, 0)
Me.Line (0, -10000)-(0, 10000)
Me.Line (0, 0)-(0, 0)

For Fi0 = 0.000013 To 2.1 * PI Step DeltaFi
rmax = 0
For Fi = 0.0000137 To 2 * PI Step 0.023
r = Count_graf(Fi, Fi0)

If r > rmax Then rmax = r

Next

Me.Line -(Cos(Fi0) * rmax, Sin(Fi0) * rmax)

Next

End Sub

Private Function Count_graf(Fi As Double, Fi0 As Double) As Double

Const Fi01 As Double = 0.00034
Const G As Double = 4000
Const E As Double = 300 * (10 ^ 3) * 60 * (10 ^ (-6))
Const sigma As Double = 7
Const rp As Double = 1000
Const Pp As Double = 150 / 1000000
Const Pm As Double = 1.38 * 10 ^ (-23) * 3 * 300000000000#

Dim psi As Double, psi1 As Double, F As Double, F1 As Double, r As Double, r1 As Double, r2 As Double, r3 As Double, xp As Double, yp As Double, eps As Double, v As Double, rm1 As Double, rm2 As Double

psi = 36 * 2.57 * (Cos(Fi - Fi0) - 1)
F = Sin(psi) / psi
psi1 = 36 * 2.57 * (Cos(Fi01 - Fi0) - 1)
F1 = Sin(psi1) / psi1


r = (E * G * sigma * (F ^ 4) / (16 * PI * PI * Pm + (4 * 3.14 * Pp * F1 ^ 2) / (rp ^ 2))) ^ (1 / 4)

Debug.Print r
Count_graf = r
End Function

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

Сообщение alibek » 14.05.2004 (Пт) 12:34

Ты лучше запости, какие у тебя ScaleMode, ScaleWidth, ScaleHeight, не мучай людей :)
Чтобы график рисовался не "разом", а постепенно, добавь Picture1.Refresh, только это замедлит рисование. Можешь поставить AutoRedraw=False, тогда рисоваться будет значительно быстрее, но тебе придется самому следить за перерисовкой. Но лучше всего, используй API.
Lasciate ogni speranza, voi ch'entrate.

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 14.05.2004 (Пт) 12:45

Me.Scale (-10000, 10000)-(10000, -10000) - больше ничего я не прописывал... Вообщем я понял, что ничего не понял ;)

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 14.05.2004 (Пт) 12:50

Кстати, график постепенно и рисуется ;)

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

Сообщение GSerg » 15.05.2004 (Сб) 7:29

Вопрос: зачем в count_graf переменные, которые не используются?
Утверждение: убери Debug.Print, маньяк, и будет тебе счастье...

ЗЫ: А PacMan получается какой-то мелкоротый :P
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Millstone
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.05.2004 (Чт) 10:50

Сообщение Millstone » 16.05.2004 (Вс) 19:54

Ну вот! Так бы и сказали сразу ;) Всё заработало нормально ;)


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

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

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

    TopList  
cron