03. maj 2005 - 14:35Der er
34 kommentarer og 3 løsninger
skæringspunkt for to linjer
Jeg har en diagram jeg bruger til at finde skæringspunktet mellem 2 linier. men jeg tænkte på om ikke man kunne smide alle sinde kordinatter til at ligge på en tabel og dermed få vba, til at regne ud hvor den første skærings punkt er henne .
mine kordinater eks. for linje 1 er : [0.5] [1.7] [1.9] [2.5] [2.9] [4.5] [6.5]
mine kordinater eks. for linje 1 er : [50.0] [0.50}
jeg skal faktisk kun bruge punktet som de to linjer skær hinanden på første gang ? hvordan kan man lave det her i vba eller access mine kordinatter ligger i tabeller ?
du skal forstille dig at man tager en tom-graf og sætter punktummer i de angivende kordinatter og tegner en linie igennem den. sådan kan vi gøre 2 ved linje 1 og linje 2. Men disse to linjer kommer til at ramme hinanden på et tidspunkt og den første gang den rammer hinanden kaldes for skæringspunkt. det kunne være at linie 1 og 2 ramte hinanden på graffen ved kordinat [5,6] eller- ...
Hm - lavede sådan noget i mid 80erne i basic, men hvor er det.
Du tager pkt sæt for pkt sæt og tester om de skærer [0.5]- [1.7] [50.0]- [0.50]
Når de skærer, så exit. Har du formlen for to liniers skæring, så er det bare igang. Det var vist noget min datter rodede med i gymnasiet. Har du ikke selv en panserformel ? Henrik
phi-del>As I can see from the link hnteknik has given, I think I may have promissed something I cant give! I could "maybe" be able to give the two co-ordinates previous to the intersection, in other words, those from the table(s). But I dont think I'll be able to give you the exact co-ordinates of the calculated intersection, or at least not without a bit of math revision, which I dont intend doing just for this question :o) So I better "Pass" on this one.
Man tager dem parvis fra f.eks. en array mange af dem vil have en løsning men falde på at p er udenfor [X1;X2] området og q er udenfor [Y1;Y2] området. Måske kan jeg lave en lille funktion henover kaffebordet, hvis overkommandoen tillader.
Jeg går ud fra x,y sættene ikke repræsenterer en lige line men kurve bestående af små liniestykker eller findes der formler for bedste kurve fit ved en x grad ligning som så itereres om på en anden kurve.
If lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q) Then MsgBox " Linierne skærer i [" & p & ";" & q & "]" Else MsgBox "Linierne er sammefaldne eller parallelle - ingen skæring" End If End Sub
Function lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q) Dim a1, b1, a2, b2 b1 = getb(x1, y1, x2, y2) b2 = getb(x3, y3, x4, y4) If b1 = b2 Then
lineintercept = False Else a1 = geta(x1, y1, b1) a2 = geta(x3, y3, b2) p = (a1 - a2) / (b2 - b1) q = a1 + b1 * p lineintercept = True End If End Function
Function getb(x1, y1, x2, y2)
If x1 = x2 Then MsgBox "linien er lodret - X=" & x1 getb = 99999999 Else getb = (y2 - y1) / (x2 - x1) End If End Function Function geta(x1, y1, b1) geta = y1 - b1 * x1 End Function
dertil skal der være en kontrol af at p ikke er udenfor [X1;X2] området og q ikke er udenfor [Y1;Y2] området.
Som du kan se, er der problemer hvis en af linierne er lodrette altså X= x1 eller X= x3 så skal der lige regnes et specialtilfælde.
If lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q, checkxy1) Then MsgBox " Linierne skærer i [" & p & ";" & q & "]" Else MsgBox "Ingen skæring - Linierne er sammefaldne eller parallelle - eller skæring udenfor liniestykke" End If End Sub
Function lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q, checkxy1) Dim a1, b1, a2, b2 b1 = getb(x1, y1, x2, y2) b2 = getb(x3, y3, x4, y4) If b1 = b2 Then
lineintercept = True If checkxy1 Then If (x2 > x1) Then If (p < x1) Or (p > x2) Then lineintercept = False End If Else If (p < x2) Or (p > x1) Then lineintercept = False End If End If If (y2 > y1) Then If (q < y1) Or (q > y2) Then lineintercept = False End If Else If (q < y2) Or (q > y1) Then lineintercept = False End If End If End If End If End Function
Function getb(x1, y1, x2, y2)
If x1 = x2 Then MsgBox "linien er lodret - X=" & x1 getb = 99999999 Else getb = (y2 - y1) / (x2 - x1) End If End Function Function geta(x1, y1, b1) geta = y1 - b1 * x1 End Function
Dette kan laves smukkere og enklere, men så vil du måske ikke helt forstå det:
If checkxy1 Then If (x2 > x1) Then If (p < x1) Or (p > x2) Then lineintercept = False End If Else If (p < x2) Or (p > x1) Then lineintercept = False End If End If If (y2 > y1) Then If (q < y1) Or (q > y2) Then lineintercept = False End If Else If (q < y2) Or (q > y1) Then lineintercept = False End If End If End If
det her ser kanon ud :):) tussind takker . men der er lidt stor mundfuld og jeg prøver at forstå det hele, men jeg kan ikke se hvor du henter dataene fra databasen .
data for linie 2 er: 0,50 50,0 ' og det er en skråt streg der går fra x axen ned til y axen
Nå - jeg troede, at du havde fod på den del: prøv da denne
Sub test() Dim x1, x2, x3, x4, y1, y2, y3, y4, p, q, checkxy1 checkxy1 = True Dim Db As Database, rs As Recordset Set Db = CurrentDb() Set rs = Db.OpenRecordset("tblxy")
x3 = 0: y3 = 50 x4 = 50: y4 = 0
Do While Not rs.EOF x1 = x2: y1 = y2 x2 = rs("x"): y2 = rs("y") If Not (x1 = Empty) Or Not (y1 = Empty) Then If lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q, checkxy1) Then MsgBox " Linierne skærer i [" & p & ";" & q & "]" 'Else 'MsgBox "Ingen skæring - Linierne er sammefaldne eller parallelle - eller skæring udenfor liniestykke" Exit Do End If End If rs.MoveNext Loop End Sub
hej Hnteknik, har pga. private årsager ikke kunne komme på netet intil nu, og det her er sådan gået istå.. jeg beklager og takker mange gange for hjælpen.
Jeg takker mange gange for din assistance. Jeg er nu endlige kommet tilbage til det her, vil så meget gerne have det til at virke. men det er en lille hage ved det her som jeg ikke kan løse derfor håber at du gider at give en lille med. Jeg har prøvet at lave en database med graf og tal og smidt koden ind, men kunne få det til at virke :( :( pga at begge liniers kode er for en ret linie:
Function geta(x1, y1, b1) geta = y1 - b1 * x1 End Function
men det er desvære sådan at den ene linie ikke er ret og derfor melder den ikke noget rigtigt tilbage.
jeg har lavet en exempel, og håber at du vil kunne hælpe mig :), jeg er nemlige gået i stå igen :(
Kurven behøves ikke at være ret - det er jo kurvestykker, som der testes på. Og en krum kurve del man jo blot op i de småstykker, man mener at have behov for, delta Y = f( deltaX). Send gerne dit oplæg til hn*fjernstjernerogaltimellem*teknik@post4.tele.dk
Men der er jo jul, så der går nok et par dage førend at jeg får tid.
Ja jeg har fået din mail, men har ikke haft til tid til at nærlæse det igennem.
Hvis du har to tabeller hver med x,y for en række punkter på en knækket kurve skal jeg få programmet til at gennemløbe et sæt fra fra tabel1 xn,yn - xn+1, yn+1 mod et tilsvarende sæt i tabel2 for alle sæt i tabel1 og 2. Hvor der er skæring på delstumperne af de knækkede koder dumpes X,Y skæring til en tabel3.
Men jeg skal have 2 tabeller med mindst 2 sæt x,y i hver tabel, eller kan jeg ikke finde nogen som helst skæring.
Jeg intensivt læser til eksamen til på mandag, så jeg tvivler, at jeg får kigget på det før efter mandag. Men blot jeg har to tabeller med x,y sæt i. En 3. tabel med resultat er kun nødvendlgi hvis der er mere end et skæringspkt på de to knækkede kurver.
Private Sub skaeringspunkt() Dim x1, x2, x3, x4, y1, y2, y3, y4, p, q, checkxy1, I As Integer, Popsy As String checkxy1 = True Dim rec As Recordset Dim qry As QueryDef Dim dbs As Database Dim TempTable As String Set dbs = CurrentDb
Numlock = "119167" Nr = "1" Mark = "0001" Graf = "Graf1"
TempTable = "TmpGraf" Set rec = dbs.OpenRecordset(TempTable)
'skæringspunkter x3 = 0: y3 = 0.5 x4 = 50: y4 = 0 Popsy = "" For I = 1 To 8 rec.MoveFirst Do While Not rec.EOF x1 = x2: y1 = y2 x2 = rec("Procent"): y2 = rec("Mpa" & I) If IsNull(x1) Or IsNull(y1) Or IsNull(x2) Or IsNull(y2) Then 'do f.. nothing Else If lineintercept(x1, y1, x2, y2, x3, y3, x4, y4, p, q, checkxy1) Then Popsy = Popsy & " Linierne skærer i [" & p & ";" & q & "] for Mpa" & I & Chr(10) + Chr(13) Exit Do Else 'MsgBox "Ingen skæring - Linierne er sammenfaldne eller parallelle - eller skæring udenfor liniestykke" ' End If End If
rec.MoveNext Loop Next MsgBox "søgning gennemført" & Chr(10) + Chr(13) & Popsy End Sub
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.