Avatar billede danielhep Nybegynder
07. september 2002 - 01:27 Der er 9 kommentarer og
2 løsninger

Beregning af punkt til punkt

Hejsa

Jeg sidder med et problem i Vb..Jeg har em imagebox med et billede som er sat til stregt. Jeg vil så kunne klikke og sætte et punkt og så klikke en gang til og lave et andet punkt. Så kan den så kunne beregne hvor langt der er imellen de to punkter.
Avatar billede jespernaur Nybegynder
07. september 2002 - 01:46 #1
Hvis (x1,y1) og (x2,y2) er koordinaterne for de 2 punkter, kan afstanden mellem dem beregnes som

sqr( (x2-x1)^2 + (y2-y1)^2 )
Avatar billede danielhep Nybegynder
07. september 2002 - 02:07 #2
ok..Så god er jeg ikke til vb..kan du give et mere nemt eks ?
Avatar billede jespernaur Nybegynder
07. september 2002 - 06:39 #3
Du får det ikke meget nemmere, hvis du vil udregne afstanden mellem 2 punkter - hvad er det, du ikke forstår?
Avatar billede martin_moth Mester
07. september 2002 - 11:52 #4
Den hedder også Pythagoras sætning ;o)
(man finder den i den lille blå formelsamling fra folkeskolen, eller http://www.math.ubc.ca/~morey/java/pyth/)
Avatar billede martin_moth Mester
07. september 2002 - 13:06 #5
Ok - det er nok ikke Pythagoras du ikke kan overskue, men hvordan du finder (x1,y1) og (x2,y2)...

Jeg har lige kikket på det, og en løsning er at lave et API-kald (dvs. et kald til en af de funktioner der er indbygget i en Windows .dll-fil)

Så gør følgende:

1) Opret et nyt projekt med en form [Form1] og et modul [Module1]
2) På formen smider du et image [Image1] og en label [Label1]
3) I Module1 smider du følgende kode:

  Public Declare Function GetCursorPos Lib "USER32" (lpPoint As pointApi) As Long

  Public Type pointApi
    lngX As Long
    lngY As Long
  End Type

4) På Form1 smider du følgende kode:

  Dim blnKlik As Boolean  'Tæller antal klik på Image1
  Dim Klik_1_X As Long
  Dim Klik_1_Y As Long

  Private Sub Form_Load()
    blnKlik = True 'Nulstiller ved programstart
  End Sub

  Private Sub Image1_Click()
    Dim MitPunkt As pointApi
    Dim Dummy
    Dim X2 As Long
    Dim Y2 As Long
 
    Label1.Caption = ""
    Dummy = Module1.GetCursorPos(MitPunkt)
    blnKlik = Not blnKlik
 
    Select Case blnKlik
      Case False
        Klik_1_X = MitPunkt.lngX
        Klik_1_Y = MitPunkt.lngY
        Label1.Caption = "Klik nr 1: X = " & Klik_1_X & ", Y = " & Klik_1_Y
      Case True
        Label1.Caption = "Klik nr 2: Afstand = " _
                          & Sqr((Klik_1_X - MitPunkt.lngX) ^ 2 - _
                                (Klik_1_Y - MitPunkt.lngY) ^ 2)
    End Select
  End Sub


Således kan du få beregnet afstanden mellem de 2 museklik du sætter på Image1.

BEMÆRK:

1) Du kan såmænd lige så godt få beregnet afstanden på et hvilket som helst andet objekt, det behøver ikke være et Image1.

2) At du f.eks. kan vælge at sætte Image1's MousePointer til "2 - cross", så man får en bedre fornemmelse af at man skal angive et punkt med musen

3) At du supernemt kan få tegnet en linie mellem de 2 punkter, da du nu har (x,y)-værdier for begge punkter, hvis du bruger et Picture1 i stedet for et Image1, se funktionen Picture1.Line ...

/Martin Moth
Avatar billede martin_moth Mester
07. september 2002 - 13:18 #6
He he - nu sidder jeg her og får ideer - jeg går ud fra, at du skal bruge ovenstående til at måle afstande på billeder - så kunne man lave en funktion, der kalibrerer afstandsmålingen, ved at klikke på to punkter med en _kendt_ afstand - og herefter måle alle øvrige afstande ud fra denne kalibrering...

Denne kalibreringsfaktor kunne så automatisk skaleres op/ned, hvis man laver en zoom-funktion i programmet, afhængigt hvor meget man zoomer

Det vil jeg have med næste gang jeg selv laver et program, der kan vise billeder ;o))

Håber du kan bruge ovenstående - ellers spørg igen!
Avatar billede danielhep Nybegynder
07. september 2002 - 13:21 #7
Martin_Moth>>

Jeg har kigget på din kode, den fungere også, men der er nogle ting, som jeg lige ville sige.
Kan det ikke gøres sådan at der bliver lavet to punkter som man kan se...
Avatar billede danielhep Nybegynder
07. september 2002 - 13:23 #8
Jeg forstår heller ikke helt beregningen, fordi når jeg selv kigger på x y kordiaterne i twips så er det helt andre tal.
Avatar billede danielhep Nybegynder
07. september 2002 - 13:25 #9
Hvad bliver de tal mål i..Jeg mener når du klikker på imageboxen to gange får du jo et tal som der er afstanden.Men hvad er den afstand målt med.Er det meter eller cm ??
Avatar billede martin_moth Mester
07. september 2002 - 20:12 #10
Hvor er jeg møg træt af at man skriver et svar, sender det og så kommer det ikke med - det er netop sket, så nu får du bare den korte version:

Mht. at sætte et punkt, så prøv at kikke på Picture1.Pset

Mht. afstandsmåling, så returnerer API-kaldet musens koordinater i pixels i forhold til cursorens placeringen på skærmen - prøv f.eks. at klikke på Picture1, flyt formen og klik igen det samme sted på Picture1 - du får et andet resultet. Men hvor koordinatsystemet har origo er bedøvende ligegyldigt, da det er en afstand du måler.

Vil du have afstanden i meter, skal du tage højde for skærmopløsning, skærmstørrelse osv. 1 pixel fylder noget forskelligt på forskellige skærme, ved du nok. Prøv evt. at kikke lidt på .Scalemode (6=mm, 3=Pixels), eller vælg at kalibrer med en kendt afstand først, som jeg var inde på tidligere.

NB: Jeg vil håbe at du forstår _beregningen_ - Pythagoras hører man vist om i 7. klasse - og at det er _resultaterne_ du ikke forstå, he he ;o))

/Martin
Avatar billede mikker Nybegynder
07. september 2002 - 22:31 #11
Jeg HADER API kald. Kan dette ikke være lige så godt?

Option Explicit
Dim a, x1, x2, y1, y2 As Integer

Private Sub Form_Load()
Text1.Visible = False
Text2.Visible = False
a = 0: x1 = 0: x2 = 0: y1 = 0: y2 = 0
End Sub

Private Sub Image1_Click()
If a = 2 Then a = 0: x1 = 0: x2 = 0: y1 = 0: y2 = 0: Text1 = "": Text2 = ""
a = a + 1
If a = 1 Then
x1 = Text1
y1 = Text2
End If
If a = 2 Then
x2 = Text1
y2 = Text2
'sqr( (x2-x1)^2 + (y2-y1)^2 )
Text3 = "Afstand: " & Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
a = 0: x1 = 0: x2 = 0: y1 = 0: y2 = 0: Text1 = "": Text2 = ""
End If
End Sub

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1 = X
Text2 = Y
End Sub

- Mikker
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

IT-JOB

Rambøll Management Consulting

Senior Software Engineer

Politiets Efterretningstjeneste

PET søger softwareingeniører til Ruslandsområdet

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Analytiker til Security Operationscenter i Cyberdivisionen Hvidovre

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger leder til Lokal IT Servicecenter i Holstebro