一、问题描述
在上一篇文章介绍了外接圆的计算链接: link,内切圆的计算和其相似。都可以根据定义写出相应的等式,构造矩阵然后求解。内切圆是指在三角形内部,半径最大,与3条边都相切的圆。
二、已知条件
已知三角形的三个顶点,
v
0
,
v
1
,
v
2
v_0,v_1,v_2
v0,v1,v2,求圆心c,半径r
3.求解
n
i
n_i
ni为三条边的法向量。
4. code
clc;
close all;
clear;
rng default;
d = rand(3,2);
p1 = d(1,:);
p2 = d(2,:);
p3 = d(3,:);
[c, r] = calCircle(p1, p2, p3);
showGraph(p1, p2, p3, c, r);
function [c, r] = calCircle(p1, p2, p3)
v1 = p2 - p1;
v2 = p3 - p1;
if(v1(1)*v2(2)-v1(2)*v2(1)<0)
pt = p2;
p2 = p3;
p3 = pt;
end
v1 = normalize(p2 - p1,'norm');
v2 = normalize(p3 - p2,'norm');
v3 = normalize(p1 - p3,'norm');
n = [v1(2) -v1(1); v2(2) -v2(1); v3(2) -v3(1)];
A = [n, -1*ones(size(n,1), 1)];
B = dot(n,[p1; p2; p3],2);
x = A\B;
c = x(1:end-1)';
r = x(end);
end
function showGraph(p1, p2, p3, c, r)
t = linspace(0,2*pi,100);
x = c + [r*sin(t'), r*cos(t')];
figure;
pt = [p1;p2;p3;p1];
plot(pt(:,1), pt(:,2));
hold on
p = [p1;p2;p3];
scatter(p(:,1), p(:,2));
hold on
plot(x(:,1), x(:,2));
hold on
scatter(c(1), c(2))
axis equal
end