Centre and radius of a circle passing through 3 points in a plane: Difference between revisions
Content added Content deleted
(Added Phix) |
(Added Wren) |
||
Line 37: | Line 37: | ||
<pre> |
<pre> |
||
Centre = 18.97851566, 16.2654108, radius = 7.354312 |
Centre = 18.97851566, 16.2654108, radius = 7.354312 |
||
</pre> |
|||
=={{header|Wren}}== |
|||
This follows the lines of the C++ code [https://www.geeksforgeeks.org/equation-of-circle-when-three-points-on-the-circle-are-given/ here]. |
|||
I've used [22.83, 2.07] for the first point, rather than [22.82, 2.07] as stated in the task description, to give agreement on the centre with the F# and Phix examples. However, my radius is twice theirs and looks right to me. |
|||
<syntaxhighlight lang="wren">var findCircle = Fn.new { |x1, y1, x2, y2, x3, y3| |
|||
var x12 = x1 - x2 |
|||
var x13 = x1 - x3 |
|||
var y12 = y1 - y2 |
|||
var y13 = y1 - y3 |
|||
var y31 = y3 - y1 |
|||
var y21 = y2 - y1 |
|||
var x31 = x3 - x1 |
|||
var x21 = x2 - x1 |
|||
var sx13 = x1 * x1 - x3 * x3 |
|||
var sy13 = y1 * y1 - y3 * y3 |
|||
var sx21 = x2 * x2 - x1 * x1 |
|||
var sy21 = y2 * y2 - y1 * y1 |
|||
var f = sx13 * x12 + sy13 * x12 + sx21 * x13 + sy21 * x13 |
|||
f = f / (y31 * x12 - y21 * x13) / 2 |
|||
var g = sx13 * y12 + sy13 * y12 + sx21 * y13 + sy21 * y13 |
|||
g = g / (x31 * y12 - x21 * y13) / 2 |
|||
var c = -x1 * x1 - y1 * y1 - 2 * g * x1 - 2 * f * y1 |
|||
var h = -g |
|||
var k = -f |
|||
var r = (h * h + k * k - c).sqrt |
|||
return [h, k, r] |
|||
} |
|||
var hkr = findCircle.call(22.83, 2.07, 14.39, 30.24, 33.65, 17.31) |
|||
System.print("Centre is at %([hkr[0], hkr[1]])") |
|||
System.print("Radius is %(hkr[2])") |
|||
System.print("\nCheck radius as the distance between the centre and the first point:") |
|||
System.print(((22.83 - hkr[0]).pow(2) + (2.07 - hkr[1]).pow(2)).sqrt)</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Centre is at [18.978515660149, 16.265410797716] |
|||
Radius is 14.708623978334 |
|||
Check radius as the distance between the centre and the first point: |
|||
14.708623978334 |
|||
</pre> |
</pre> |
Revision as of 21:47, 20 February 2024
Centre and radius of a circle passing through 3 points in a plane is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Write a function which returns the centre and radius of a circle passing through three point in a plane. Demonstrate the function using the points (22.82,2.07) (14.39,30.24) and (33.65,17.31)
F#
// Centre and radius of a circle passing through 3 points in a plane. Nigel Galloway: February 20th., 2024
let c (a,b) (c,d) (e,f)=(0.5*((a*a+b*b)*(f-d)+(c*c+d*d)*(b-f)+(e*e+f*f)*(d-b))/(a*(f-d)+c*(b-f)+e*(d-b)),
0.5*((a*a+b*b)*(e-c)+(c*c+d*d)*(a-e)+(e*e+f*f)*(c-a))/(b*(e-c)+d*(a-e)+f*(c-a)))
let d n g = let n,g=fst n-fst g,snd n-snd g in sqrt(n*n+g*g)/2.0
let circ P1 P2 P3 = let c=c P1 P2 P3 in (c,d c P1)
let centre,radius=circ (22.83, 2.07) (14.39, 30.24) (33.65, 17.31)
printfn $"Centre = %A{centre}, radius = %f{radius}"
- Output:
Centre = (18.97851566, 16.2654108), radius = 7.354312
Phix
with javascript_semantics
function circle(sequence p1, p2, p3)
atom {a,b} = p1, {c,d} = p2, {e,f} = p3,
cx = 0.5*((a*a+b*b)*(f-d)+(c*c+d*d)*(b-f)+(e*e+f*f)*(d-b))/(a*(f-d)+c*(b-f)+e*(d-b)),
cy = 0.5*((a*a+b*b)*(e-c)+(c*c+d*d)*(a-e)+(e*e+f*f)*(c-a))/(b*(e-c)+d*(a-e)+f*(c-a)),
r = sqrt(power(cx-e,2)+power(cy-f,2))/2
return {{cx,cy},r}
end function
atom {{cx,cy},r} = circle({22.83,2.07},{14.39,30.24},{33.65,17.31})
printf(1,"Centre = %.8f, %.7f, radius = %.6f\n",{cx,cy,r})
- Output:
Centre = 18.97851566, 16.2654108, radius = 7.354312
Wren
This follows the lines of the C++ code here.
I've used [22.83, 2.07] for the first point, rather than [22.82, 2.07] as stated in the task description, to give agreement on the centre with the F# and Phix examples. However, my radius is twice theirs and looks right to me.
var findCircle = Fn.new { |x1, y1, x2, y2, x3, y3|
var x12 = x1 - x2
var x13 = x1 - x3
var y12 = y1 - y2
var y13 = y1 - y3
var y31 = y3 - y1
var y21 = y2 - y1
var x31 = x3 - x1
var x21 = x2 - x1
var sx13 = x1 * x1 - x3 * x3
var sy13 = y1 * y1 - y3 * y3
var sx21 = x2 * x2 - x1 * x1
var sy21 = y2 * y2 - y1 * y1
var f = sx13 * x12 + sy13 * x12 + sx21 * x13 + sy21 * x13
f = f / (y31 * x12 - y21 * x13) / 2
var g = sx13 * y12 + sy13 * y12 + sx21 * y13 + sy21 * y13
g = g / (x31 * y12 - x21 * y13) / 2
var c = -x1 * x1 - y1 * y1 - 2 * g * x1 - 2 * f * y1
var h = -g
var k = -f
var r = (h * h + k * k - c).sqrt
return [h, k, r]
}
var hkr = findCircle.call(22.83, 2.07, 14.39, 30.24, 33.65, 17.31)
System.print("Centre is at %([hkr[0], hkr[1]])")
System.print("Radius is %(hkr[2])")
System.print("\nCheck radius as the distance between the centre and the first point:")
System.print(((22.83 - hkr[0]).pow(2) + (2.07 - hkr[1]).pow(2)).sqrt)
- Output:
Centre is at [18.978515660149, 16.265410797716] Radius is 14.708623978334 Check radius as the distance between the centre and the first point: 14.708623978334