Hur kan man rita till exempel en sinuskurva med Pset(x,y) och tillhörande koordinataxlar. Private Sub Command1_Click() Hej Kan man på något sätt få x-värdet utsatt på en x-axel och y på en y-axel för en kurva Den har blir skojig Hej Mitt förslag för att rita en sinuskurva. PSet är inte det lämpligaste att använda utan Line är bättre. Hej Bara några smågrejer på Andreas version<br><br> Hej Ska du försöka läxa upp mig? Så här skulle Line varianten se uta av funktionen(Korrigerat stavfelen oxå): Tänk om jag inte vill ha med färg 15 då?! Hej Vad då för ton? Det var du som förutsatte något. Jag hade inte tänkt på vad jag fick med för tal och inte med för tal, så när du sa att man inte får med nr 15 så kan man ju säga att det vill jag inte ha, för att skyla sin miss. Hej Jag skulle rekommendera att du använder ScaleMode=User istället. Eftersom den tid det tar att rita är försumbart så struntar jag i att man kan cacha värdena. Behövs bara ha en flagga som gör att den inte ritas om Resize redan dimensionerat om den. Enda anledningen att jag har någon kod i resize är för att den inte ritas om när man minskar storleken på formuläret.Sinuskurva
Sv: Sinuskurva
Dim a As Single
Dim y As Single
Dim x As Single
Form1.BackColor = 0
xx = 0
yy = 2000
For a = 0 To 100 Step 0.01
x = x + 1
y = Sin(a) * 100
Form1.PSet (x + xx, y + yy), QBColor(15)
Next
End Sub
Lägg in en knapp i formen och koden i knappen så ska det gå.Sv: Sinuskurva
Snyggt MickeB,tänkte just svara när du var klar
Liten kommentar du kan manipuler y = Sin(a) * 100 till tex * 500
ta inte illa upp jag ville bara kompletera.
Option Explicit
Private Sub Command1_Click()
Dim a As Single, xx As Long
Dim y As Single, yy As Long
Dim x As Single
Form1.BackColor = 0
xx = 0
yy = 2000
For a = 0 To 100 Step 0.01
x = x + 2
y = Sin(a) * 500
Form1.PSet (x + xx, y + yy), QBColor(15)
Next
End Sub
mvh
Sven Sv: Sinuskurva
Sv: Sinuskurva
Form1.BackColor = 0
DrawWidth = 5
xx = 0
yy = 2000
For a = 0 To 100 Step 0.001
Randomize
f = Int(Rnd * 15)
x = x + 1
y = Sin(a) * 1000
Form1.PSet (x + xx, y + yy), QBColor(f)
NextSv: Sinuskurva
Ytterligare en kommentar. Det är onödigt att ha
Randomize i varje For loop ,räcker med en /programstart
Du skall dim :a alla variabler,om du skriver Int(Rnd * 15)
får du inte med färg 15 det blir 0 till 14
Option Explicit
Private Sub Form_Load()
Randomize
End Sub
Private Sub Command1_Click()
Dim a As Single, xx As Long
Dim y As Single, yy As Long
Dim x As Single, f As Long
Form1.BackColor = 0
xx = 0
yy = 2000
For a = 0 To 100 Step 0.01
f = Int(Rnd * 16)
x = x + 2
y = Sin(a) * 500
Form1.PSet (x + xx, y + yy), QBColor(f)
Next
End Sub
Sven igenSv: Sinuskurva
<code>
Option Explicit
Const Pi As Single = 3.14159265358979
Public Sub RenderGraph(Form As Form, Left As Single, Top As Single, Width As Single, Height As Single, Optional Color As Long, Optional IntervalStart As Single, Optional IntervalLength As Single = 2 * Pi)
Dim y As Single
Dim x As Single
Dim Angel As Single
Dim DeltaAngel As Single
Dim DeltaWidth As Single
Dim DeltaHeight As Single
Dim LineCenter As Single
DeltaWidth = Form.ScaleX(1, vbPixels, Form.ScaleMode)
DeltaHeight = Height / 2
LineCenter = Top + DeltaHeight
Angel = IntervalStart
DeltaAngel = IntervalLength * DeltaWidth / Width
For x = Left To Left + Width Step DeltaWidth
y = LineCenter + Sin(Angel) * DeltaHeight
Form.PSet (x, y), Color
Angel = Angel + DeltaAngel
Next
End Sub
Private Sub Form_Paint()
Cls
RenderGraph Me, ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight
End Sub
Private Sub Form_Resize()
Cls
RenderGraph Me, ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight
End Sub
</code>Sv: Sinuskurva
Nu har Andreas haft rätt en gång denna vecka. :-)
Som han säger man skall undvika PSet Line är mycket snabbare sa Bull
mvh
SvenSv: Sinuskurva
>Dim Angel As Single <br>
>Dim DeltaAngel As Single <br>
Änglar... jaha :) <br>
Stavas Angle egentligen<br><br>
>Dim DeltaWidth As Single <br>
>Dim DeltaHeight As Single<br>
Konstiga variabelnamn.<br>
DeltaX och DeltaY passar väl bättre?<br>
Sedan betyderju Delta förändring. DeltaHeight används aldrig i din kod som en vanlig Delta.<br><br>
>Form.PSet (x, y), Color <br>
Skulle du inte använda Line?<br>
typ Form.Line -(x, y), Color<br><br>
>y = LineCenter + Sin(Angel) * DeltaHeight <br>
Klagar ni på Pset, men räknar ut sinus för en vinkel varje gång?<br><br>
Det bör vara snabbare med:
<code>
'I modul
Private Const ValuesPerUnit As Long=100
Private Const n As Long=2*PI*ValuesPerUnit
Private SinArray(0 to n) As Single, bInited As Boolean
Public Function Sinus(Angle As Single) As Single
Dim i As Integer
If Not bInited Then
For i=0 to n
SinArray(i) = Sin(i/n)
Next i
bInited=True
End If
Select Case Angle
Case Is < 0
Sinus = -Sinus(-Angle)
Case Is > 2*PI
Sinus = Sinus(Angle-2*PI)
Case Else
Sinus=SinArray(Angle*ValuesPerUnit)
End Select
End Function
</code>
Jag har inte provat, men det bör fungera. <br><br>
/Niklas JanssonSv: Sinuskurva
Givetvis skall man optimer med en array som har
alla sinusvärde föruträknade.
Men Line lösningen är iallafall mycket effektivare än PSet.
"Delta" betyder väl som närmast "Skillnad"
tycker
SvenSv: Sinuskurva
Till att börja med så var uppdraget "sinuskurva med Pset". Jag använde bara PSet därför just det.
Okej så DeltaHeight eller DeltaY är lite fel. Amplitude skulle vara lite mer passande. Men jag har för mig att det är från max till min. Så mitt värde är bara halva amplituden. Får skylla på att jag inte är så insatt i mattematik. Har bara läst t.o.m. C-matte i gymnasiet.
Eftersom upplösningen kan förändras är det ju inte lämpligt att cacha värdena för just mitt exempel. Eftersom funktionen bara visar 360 grader utförs varje beräkning bara en gång. Så att dimensinera en array, beräkna och tilldela alla värden är då ingen optimering.
Men jag brukar cacha beräkningarna med sin och cos i t.ex när jag roterar en textur i mitt spel jag jobbar på. Har jag det fyra kordinaterna i förhållande till centrum som jag roterar i ett fast antal riktningar(vinklar). Då är en array lämpligt.
Stavfel, Förlåt då. Jag är ju trots allt bara mänsklig. ;O)
Men jag tackar så mycket för din kritik. Tycker om att få det. Kan jag förklara hur jag tänkt. Så fortsätt med det. Sv: Sinuskurva
<code>
Public Sub RenderGraph(Form As Form, Left As Single, Top As Single, Width As Single, Height As Single, Optional Color As Long, Optional IntervalStart As Single, Optional IntervalLength As Single = 2 * Pi)
Dim X As Single
Dim Y As Single
Dim Angle As Single
Dim DeltaX As Single
Dim DeltaY As Single
Dim DeltaAngle As Single
Dim LineCenter As Single
DeltaX = Form.ScaleX(1, vbPixels, Form.ScaleMode)
DeltaY = Height / 2
LineCenter = Top + DeltaY
Angle = IntervalStart
DeltaAngle = IntervalLength * DeltaX / Width
Form.PSet (Left, LineCenter + Sin(Angle) * DeltaX), Color
For X = Left To Left + Width Step DeltaX
Y = LineCenter + Sin(Angle) * DeltaY
Form.Line Step(0, 0)-(X, Y), Color
Angle = Angle + DeltaAngle
Next
End Sub
</code>Sv: Sinuskurva
Denna kodsnutt var bara för att ha roligt och leka med kurvan, inte att göra ett programmeringstekniskt korrekt program.
Frågan återstå - att få dit koordinataxlar med där skalan anpassas till x och y värden och dessa värden sätts ut med jämna mellanrum.Sv: Sinuskurva
>Tänk om jag inte vill ha med färg 15 då?!
Inte den tonen då får du in mer hjälp.
Sven Sv: Sinuskurva
Sv: Sinuskurva
Jag skrev
om du skriver Int(Rnd * 15) får du inte med färg 15 det blir 0 till 14.
Ett vänligt påpekande, utan pekpinnar.Det är ett ganska
vanligt misstag att man bortser från att Rnd börjar på 0
Dvs man får ofta skriva ett (1) mer än man tänkt för att få
med alla tal.Vill man inte ha med 0 får man skriva Int(Rnd * 15 + 1)
SvenSv: Sinuskurva
Sätt ScaleTop till 1.2 , ScaleHeight till -2.4 (jag tror det blir så, du får experimentera lite med minustecknen)
ScaleLeft till -PI, ScaleWidth till 2*PI
Då kan du göra koordinataxlarna med line (scaleleft,0) - (Scaleleft+ScaleWidth,0), och motsvarande för y-axeln.
Problemet är att det blir svårare med texten då.
Du väljer plats att skriva ut texten på med CurrentX/CurrentY, och skriver ut den med Print.
Ett sätt att lösa det är att ha ScaleMode=Pixel och sedan göra funktioner för att få fram skärm-x/y från "World"-x/y.
Brukar jag göra.
Sedan ritar du linjer mellan (xmin,0)-(xmax,0) och (0,ymin)-(0,ymax) Och då måste du naturligtvis fixa så att koordinaterna stämmer överrens med bilden.
Sedan så hoppar du från vänster till höger med xstep och vid varje steg skriver du ut värdet (eventuellt ritar ut ett litet streck). Jag lägger upp ett program som visar detta. (Komplex Master heter det)
Andreas:
Det där med cachningen: Du kan ha en cache som förändras, och detta kan behövas eftersom din egna kod ritar upp funktionen flera gånger. (vid Form_Resize)
Det är bara att använda en faktor som bestämmer när man skall förändra antalet punkter. Detta tjänar du mycket tid på.
/Niklas JanssonSv: Sinuskurva
Men varför förverklar du inte dina förslag. Skriv koden som cachar värdena. Så kan vi ju se vad du pratar om och ta lärdom av det. Har inget emot att jag har fel. Men det är du som bäst vet vad du pratar om. Skriver du ett program funktion som implementerar dina tankegångar. Kan vi lättare förstå vad du menar och tänker.
Tills dess kan vi snacka teori hur mycket vi vill. Jag håller mig till det praktiska.