Avatar billede tdaugaard Nybegynder
21. maj 2000 - 21:37 Der er 3 kommentarer og
1 løsning

.Line algoritme ??

Hejsa!

Er der nogle der har en algoritme til at en Line funktion ??

En funktion/sub der kan fortælle mig f.eks. hvis jeg vil have en linie der går fra eksempelvis 0,0 til 14,30 hvilke pixels i et matrix på 14,72 HxB der skal farves.
Avatar billede philiph Nybegynder
21. maj 2000 - 23:57 #1
Kan noget i retningen af følgende bruges?

Sub DoPlot(arr() As Integer, StartX As Integer, StartY As Integer, EndX As Integer, EndY As Integer)
  Dim i As Integer
  Dim delta As Double
  Dim x As Double
  Dim y As Double
 
  If Abs(StartX - EndX) > Abs(StartY - EndY) Then
    delta = (EndY - StartY) / Abs(StartX - EndX)
    y = StartY
    For i = StartX To EndX Step Sgn(EndX - StartX)
      arr(i, y) = True
      y = y + delta
    Next i
  Else
    delta = (EndX - StartX) / Abs(StartY - EndY)
    x = StartX
    For i = StartY To EndY Step Sgn(EndY - StartY)
      arr(x, i) = True
      x = x + delta
    Next i
  End If
End Sub

Java er iøvrigt meget sød på dette punkt. Der kan du bruge de indbyggede funktioner til at tegne direkte i et array. Det har jeg brugt til at lave en lille applet der kører på min hjemmeside: http://www.1op.dk/dsd

Philip
Avatar billede tdaugaard Nybegynder
23. maj 2000 - 16:39 #2
<< philiph >>

Sorry, men koden virkede ikke helt efter hensigten. Først virkede den slet ikke (Abs(StartX - EndX) > Abs(StartY - EndY) var åbenbart True) bagefter lavede jeg det om så den brugte kode stykke to (efter Else) og der kom der godt nok en linie, men den var punkteret...
Avatar billede philiph Nybegynder
23. maj 2000 - 19:55 #3
???

Jeg har testet det ved at lave en VB formular og brugt PSet funktionen direkte på formularen, og der virkede det efter hensigten. Formålet med udtrykket:
  If Abs(StartX - EndX) > Abs(StartY - EndY) Then
er netop at finde den akse hvor der er størst forskel på X og Y. Delta indeholder så den fraktion der lægges til den koordinat med mindst forskel (delta vil altid være imelle 0 og 1). Hvis du ændre i dette udtryk, så en forkert akse vælges som "størst", opnår du netop stiplede linier.

Du kan teste det på følgende måde:
Lav en ny formular, slå AutoRedraw til, lav en kommandoknap og indsæt følgende:

Private Sub Command1_Click()
  DoPlot 14, 72, 10, 10 '*** Prøv med forskellige værdier ***
End Sub

Sub DoPlot(StartX As Integer, StartY As Integer, EndX As Integer, EndY As Integer)
  Dim i As Integer
  Dim delta As Double
  Dim x As Double
  Dim y As Double
 
  If Abs(StartX - EndX) > Abs(StartY - EndY) Then
    delta = (EndY - StartY) / Abs(StartX - EndX)
    y = StartY
    For i = StartX To EndX Step Sgn(EndX - StartX)
      Plot i, y
      y = y + delta
    Next i
  Else
    delta = (EndX - StartX) / Abs(StartY - EndY)
    x = StartX
    For i = StartY To EndY Step Sgn(EndY - StartY)
      Plot x, i
      x = x + delta
    Next i
  End If
End Sub

Sub Plot(ByVal x As Integer, ByVal y As Integer)
  x = Me.ScaleX(x, vbPixels, vbTwips)
  y = Me.ScaleY(y, vbPixels, vbTwips)
  Me.PSet (x, y)
End Sub

Når du starter formularen og trykker på knappen skulle du meget gerne få den ønskede linie.

Philip
Avatar billede tdaugaard Nybegynder
23. maj 2000 - 23:49 #4
Det var underligt ...
Er det ikke næsten den samme kode ??
For det virker nu .. med den anden kode su lige gav mig ..

Well anywayz, 68p til dig!

Og mange tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester