Det handler bare om at teste, at korteste afstand fra linjen til centrum af cirklen er mindre end cirklens radius. Og afstand mellem linje og punkt er ganske veldefineret og let at finde information om.
Skæringspunkter har du ikke brug for nej - men jeg blev sgu lige opsat på at lave noget der kunne... og kan højst sandsynligt også selv bruge det på et tidspunkt!
Jeg kan overhovedet ikke overskue jeres sindsygt lange formler - men det er vel nok rigtige. Jeg tror jeg laver en eller anden pædagogisk gennemgang i stedet ;)
Afstandsformel mellem punktet P0(x0,y0) og linien l: dist(P,l) = (a*x0 + b - y0)/Math.sqrt(a*a + 1)
Har du to punkter på linien P1(x1,y1) og P2(x2,y2), så kan du finde hældningskooficenten: a = (y2-y1) / (x2-x1) og du kan også finde liniensskæringspunkt i y-aksen (b): b = y1 / a*x1
Så tilbage til afstandsformlen - her er det bare at indsætte de forskellige variabler - eller måske mere overskueligt lave koden i flere etaper: //cirklens centrum P0(x0,y0) og radius r //første punkt på linien P1(x1,y1) //andet punkt på linien P2(x2,y2) a = (y2-y1) / (x2-x1); b = y1 / a*x1; afstand = (a*x0 + b - y0)/Math.sqrt(a*a + 1); //da en afstand ikke kan være negativ må den gøres positiv, hvis den er negativ if(afstand<0) afstand = -1*afstand; if(afstand<r) trace("linien ramme cirklen");
Det var den pædagogiske gennemgang af min del af koden :-D
Ups lille hygge fejl med beregningen af b - her er den rigtige kode: a = (y2-y1) / (x2-x1); b = y1 - a*x1; afstand = Math.round( (a*x0 + b - y0)/Math.sqrt(a*a + 1) ); if(afstand<0) afstand = -1*afstand; if(afstand<r) trace("linien ramme cirklen");
Det var nu ikke så meget, hvordan man beregner det, for det er jeg med på, men det er nu mere, at ovenstående script ikke vil være mange millisekunder længere tid om at køre end dit oprindelige - mens vedligeholdelse af det overskuelige script kan være mange timer nemmere :)
hæhæ - ja jeg må har glemt at smide de små detaljer på variablerne - plerjer jeg sgu ellers ikke at glemme. Kan godt forstå koden er uoverskuelig - men det simpelthen "the way to do it" - smækkede formlen for en linie og en cirkel ind i programmet derive og fik den til at isolere x, det er ikke helt simpelt, derfor er der heller ikke nogen simpel løsning ;)
Men kan da godt supplere din artikel med lidt om geometrien hvis det skal være :)
du ledte mig da på sporet ved at sige at jeg skulle finde den korteste vej til linien og sammenligne den med radius i cirklen (det var faktisk der jeg sad fast) - men pyroman kan da få del i det enorme point gilde for sine gode indsats :-D
hehe - hvis vi alle skal starte forfra med alting og ikke bruge hjælpemidler ville vi bremse vores egen udvikling og i stedet for at blive vist på en computerskærm ville eksperten.dk være hugget ind i en stentavle! Tag nu de fleste af pointene selv - du fandt selv ud af det - mit script var bare et lille show off ;)
for det er jo enorme mængder point du fyrer af dér! - så de skulle ikke havne hos de forkerte! ;)
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.