Elikäs pitäisi selvittää kaaren keskipiste. Lähtö tietona on vain kolme koordinaatti pistettä. Saan selvitettyä noiden pisteiden väliset etäisyydet ja pisteiden kautta kulkevan ympyrän säteen.
Mutta miten saisin selviettyä vielä ympyrän keskipisteen koordinaatin
<?php $br = "<br/>\n"; // Säästetään näppäimiä /* X coordinate | Y coordinate */ $x1 = 368; $y1 = -481; $x2 = 444; $y2 = -569; $x3 = 541; $y3 = -496; #### FUNCTIONS #### function distance($x1, $y1, $x2, $y2){ $a = pow(($x1-$x2), 2); $b = pow(($y1-$y2), 2); $c = sqrt($a+$b); return $c; } function radius($a, $b, $c){ $r = ($a * $b * $c) / sqrt(($a+$b+$c) * ($b+$c-$a) * ($c+$a-$b) * ($a+$b-$c)); return $r; } #### FUNCTIONS #### // Lasketaan etäisyydet $d1 = round( distance($x1, $y1, $x2, $y2), 3); // 116.276 $d2 = round( distance($x1, $y1, $x3, $y3), 3); // 173.649 $d3 = round( distance($x2, $y2, $x3, $y3), 3); // 121.400 // Lasketaan kolmion ulkopuolinen säde $r = round(radius($d1, $d2, $d3), 3); // 87.021 // Tulostetaan testailut echo "Etäisyydet:" . $br; echo "A) ". $d1 .$br ."C) ". $d2 . $br ."C) ". $d3 . $br; echo "Säde:" . $br; echo $r; ?>
Katso vaikkapa http://mathworld.wolfram.com/Circle.html (kaavat 25-34).
Yksi tapa keskipisteen laskemiseen on sinun koodiisi jatkettuna tällainen:
$dx = ($x2 - $x1) / 2; $dy = ($y2 - $y1) / 2; $t = tan(asin($d1 / 2 / $r)); $xa = $x1 + $dx + $dy / $t; $ya = $y1 + $dy - $dx / $t; $da = hypot($xa - $x3, $ya - $y3); $xb = $x1 + $dx - $dy / $t; $yb = $y1 + $dy + $dx / $t; $db = hypot($xb - $x3, $yb - $y3); if (abs($r - $da) < abs($r - $db)) { list($xk, $yk) = array($xa, $ya); } else { list($xk, $yk) = array($xb, $yb); }
Funktiosi distance on turha (tai ainakin turhan mutkikas), koska distance(x1, y1, x2, y2) == hypot(x1 - x2, y1 - y2).
Koetin tutkiskella tuota jukan linkkiä, mutta kaavat eivät lähteneet aukeamaan oikein.. Metablolixille suur kiitos. Juuri tätä kaipasinkin. Nyt saan yhdessä funktiossa selvitettyä tarvittavat asiat.
<?php $br = "<br/>\n"; // Säästetään näppäimiä /* X coordinate | Y coordinate */ $x1 = 368; $y1 = -481; $x2 = 444; $y2 = -569; $x3 = 541; $y3 = -496; #### FUNCTIONS #### function c($x1, $y1, $x2, $y2, $x3, $y3){ // Lasketaan etäisyydet $d1 = hypot(($x1 - $x2), ($y1 - $y2)); // 116.276 $d2 = hypot(($x1 - $x3), ($y1 - $y3)); // 173.649 $d3 = hypot(($x2 - $x3), ($y2 - $y3)); // 121.400 // Lasketaan kolmion ulkopuolinen säde $r = ($d1 * $d2 * $d3) / sqrt(($d1+$d2+$d3) * ($d2+$d3-$d1) * ($d3+$d1-$d2) * ($d1+$d2-$d3)); // 87.021 /* TODO lisätään sisäpuolisen säteen laskeminen */ // Lasketaan keskipiste $dx = ($x2 - $x1) / 2; $dy = ($y2 - $y1) / 2; $t = tan(asin($d1 / 2 / $r)); $xa = $x1 + $dx + $dy / $t; $ya = $y1 + $dy - $dx / $t; $da = hypot($xa - $x3, $ya - $y3); $xb = $x1 + $dx - $dy / $t; $yb = $y1 + $dy + $dx / $t; $db = hypot($xb - $x3, $yb - $y3); if (abs($r - $da) < abs($r - $db)) { $cx = xa; $cy = ya; } else { $cx = xb; $cy = yb; } $ready = array( "d1" => $d1, "d2" => $d2, "d3" => $d3, "r" => $r, "cx" => $xk, "cy" => $yk ); return $ready; } #### FUNCTIONS #### var_dump(c($x1, $y1, $x2, $y2, $x3, $y3)); ?>
EDIT
Tässä lisää muutamia juttuja koodiin. Ei siis uusia kysymyksiä vaan lisäyksiä, jos joku muukin haluaa tätä hyödyntää.
#### LISÄYS #### $r1 = $r; // // Suuren kaaren kehän pituus ja pinta-ala $r1c = 2*pi()*$r1; $r1a = pi() * pow($r1, 2); // lasketaan kolmion pinta-ala $p = ($d1 + $d2 + $d3) / 2; $a = sqrt($p*($p - $d1)*($p - $d2)*($p - $d3)); // Pienen kaaren säde $r2 = 2*$a / ($d1 + $d2 + $d3); // $r2 = $a / $p; // vaihtoehtoinen tapa. // Pienen kaaren kehän pituus ja pinta-ala $r2c = 2*pi()*$r2; $r2a = pi() * pow($r2, 2); #### LISÄYS ####
Koodini toki tekee jo tarvittavan mutta haluan yrittää opetella tämän toisenkin tavan (Jaskan linkki), matriiseja en vaan oo koskaan käyttänyt tai opetellut.
Ymmärtäsin tämän niin, että mun tarvitsee koota ensin parit taulukot. Mutta.. miten lähden purkamaan tätä. Vai olenko niin hakoteillä ettei kannata edes lähteä yrittään opetella?
Esimerkkinä.
pisteet (2,2), (1,0) & (3,0)
| x^2+y^2 x y 1| = 0 | 8 2 2 1| | 1 1 0 1| | 9 3 0 1| // a = x y 1 |2 2 1| |1 0 1| |3 0 1| // d = x^2+y^2 y 1 |8 2 1| |1 0 1| |9 0 1| // e = x^2+y^2 x 1 |8 2 1| |1 1 1| |9 3 1| // f = x^2+y^2 x y |8 2 2| |1 1 0| |9 3 0|
Determinantit oppii yliopiston matikan peruskursseilla, geometrian kurssilla varmaankin tuo ympyrän yhtälön determinanttimuoto. En itse lukenut kyseistä euklidisen geometrian kurssia, joten en ole asiasta varma.
Tarkastellaan tuota pisteiden (2,2), (1,0) & (3,0) kautta kulkevaa yhtälöä. Laskin tämän Sagella.
sage: x=var('x');y=var('y');x1=2;y1=2;x2=1;y2=0;x3=3;y3=0; sage: M=matrix(SR,4,[x^2+y^2,x,y,1,x1^2+y1^2,x1,y1,1,x2^2+y2^2,x2,y2,1,x3^2+y3^2,x3,y3,1]) sage: M.determinant() 4*x^2 + 4*y^2 - 16*x - 6*y + 12 sage: expand((2*x-4)^2+(2*y-3/2)^2-25/4) 4*x^2 + 4*y^2 - 16*x - 6*y + 12 sage:
Tuossa viimeisessä vaiheessa yhtälö on vaan täydennetty tai tunnistettu neliöiden summaksi. Siis pisteiden (2,2), (1,0) & (3,0) kautta kulkevan ympyrän yhtälö on
(2*x-4)^2+(2*y-3/2)^2=25/4
Sitten jaetaan puolittain nelosella, jolloin saadaan
(x-2)^2+(y-3/4)^2=25/16
Tästä nähdään, että keskipiste on (2,3/4) ja säde 5/4.
Aihe on jo aika vanha, joten et voi enää vastata siihen.