07. september 2002 - 01:27Der 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.
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
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 ...
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!
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...
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 ??
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))
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
Synes godt om
Ny brugerNybegynder
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.