Curve that touches three points: Difference between revisions

Added Algol 68
(Added XPL0 example.)
(Added Algol 68)
 
(2 intermediate revisions by 2 users not shown)
Line 202:
Center : (105.0, 81.3)
Radius : 118.8
</pre>
 
=={{header|ALGOL 68}}==
{{Trans|Ada}}
As with the Ada and FreeBASIC translation of it, finds the centre and radius of a circle through the points.
<syntaxhighlight lang="algol68">
BEGIN # draw a curve that passes through 3 points - translated from the Ada #
# sample - finds the centre and radius of a circle through the points #
 
REAL x1 = 10; # Point P1 #
REAL y1 = 10;
 
REAL x2 = 100 # Point P2 #;
REAL y2 = 200;
 
REAL x3 = 200; # Point P3 #
REAL y3 = 10;
 
REAL x4 = ( x1 + x2 ) / 2; # Point P4 - midpoint between P1 and P2 #
REAL y4 = ( y1 + y2 ) / 2;
REAL s4 = ( y2 - y1 ) / ( x2 - x1 ); # Slope P1-P2 #
REAL a4 = -1 / s4; # Slope P4-Centre #
# Y4 = A4 * X4 + B4 <=> B4 = Y4 - A4 * X4 #
REAL b4 = y4 - a4 * x4;
 
REAL x5 = ( x2 + x3 ) / 2; # Point P5 - midpoint between P2 and P3 #
REAL y5 = ( y2 + y3 ) / 2;
REAL s5 = ( y3 - y2 ) / ( x3 - x2 ); # Slope P2-P3 #
REAL a5 = -1.0 / s5; # Slope P5-Centre #
# Y5 = A5 * X5 + B5 <=> B5 = Y5 - A5 * X5 #
REAL b5 = y5 - a5 * x5;
 
# Find centre #
# Y = A4 * X + B4 -- Line 1 #
# Y = A5 * X + B5 -- Line 2 #
# Solve for X: #
# A4 * X + B4 = A5 * X + B5 #
# A4 * X - A5 * X = B5 - B4 #
# X * (A4 - A5) = B5 - B4 #
# X = (B5 - B4) / (A4 - A5) #
REAL xc = ( b5 - b4 ) / ( a4 - a5 );
REAL yc = a4 * xc + b4;
# Radius #
REAL r = sqrt( ( x1 - xc ) ^ 2 + ( y1 - yc ) ^ 2 );
 
print( ( "Centre : (", fixed( xc, -6, 1 ), ", ", fixed( yc, -6, 1 ), " )", newline ) );
print( ( "Radius : ", fixed( r, -6, 1 ), newline ) )
 
END
</syntaxhighlight>
{{out}}
<pre>
Centre : ( 105.0, 81.3 )
Radius : 118.8
</pre>
 
Line 1,533 ⟶ 1,587:
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
 
=={{header|PHP}}==
Finds a circle that passes through those three points. Adapted from AutoHotkey.
 
<syntaxhighlight lang="PHP">
function circle_3_points($x1, $y1, $x2, $y2, $x3, $y3) {
$x4 = ($x1 + $x2) / 2.0;
$y4 = ($y1 + $y2) / 2.0;
$s4 = ($y2 - $y1) / ($x2 - $x1);
$a4 = -1.0 / $s4;
$b4 = $y4 - $a4 * $x4;
$x5 = ($x2 + $x3) / 2.0;
$y5 = ($y2 + $y3) / 2.0;
$s5 = ($y3 - $y2) / ($x3 - $x2);
$a5 = -1.0 / $s5;
$b5 = $y5 - $a5 * $x5;
$xc = ($b5 - $b4) / ($a4 - $a5);
$yc = $a4 * $xc + $b4;
$r = √(²($x1 - $xc) + ²($y1 - $yc));
return [$xc, $yc, $r];
}
</syntaxhighlight>
 
=={{header|Raku}}==
Line 1,632 ⟶ 1,708:
}</syntaxhighlight>
See [https://github.com/thundergnat/rc/blob/master/img/Curve-3-points-perl6.png Curve-3-points-perl6.png] (offsite .png image)
 
=={{header|RPL}}==
HP-49+ RPL has a built-in function named <code>LAGRANGE</code> that returns the curve equation from the 3 points, but let's consider it as belonging to a library.
{{works with|HP|48G}}
[[File:Parabol.png|thumb|right|alt=HP-48G emulator screenshot|HP-48G emulator screenshot]]
« → a b c
« { 0 0 0 }
c a - C→R SWAP / c b - RE /
b a - C→R SWAP / c b - RE / -
1 SWAP PUT
b a - C→R SWAP / OVER 1 GET b a + RE * -
2 SWAP PUT
a IM OVER 1 GET a RE SQ * - OVER 2 GET a RE * -
3 SWAP PUT
{ 'X^2' 'X' 1 } * ∑LIST
» » '<span style="color:blue">PAREQ</span>' STO
« # 131d # 64d PDIM 0 210 DUP2 XRNG YRNG
FUNCTION
(10,10) (100,200) (200,10)
3 DUPN <span style="color:blue">PAREQ</span> STEQ
ERASE DRAW
1 3 '''START''' PIXOFF '''NEXT''' <span style="color:grey">''@ switch off the 3 points on the curve''</span>
{ } PVIEW
{ PPAR EQ } PURGE
» '<span style="color:blue">TASK</span>' STO
 
=={{header|Wren}}==
3,060

edits