仿射变换一个基本的性质——保持面积之比不变。利用这个性质,我们可以先在直角三角形中探讨这个问题,最后利用仿射变换将其推广到一般三角形中。
如图建系, ,
则
则两三角形面积之比为
即
其中 ,而 与题目中的 关系为:
它们是很容易转换的。现在让 变动起来,显然 与 满足反比例关系。
与 的运动合成点 的运动,由反比例函数的知识,点 在一个双曲线 的一支上运动。不过这离我们所求的仍有一段距离:我们想知道的是由 运动所包络而成的曲线 。注意到 , 是双曲线上过点 的切线。所以 是 平移的结果:
平移常数 、 可以通过初始位置而待定;至于,这个通过简单的斜率计算可得:
当然,我只讨论了直线 过 与 的情况,其余情况类似.
按照我们的计划,我们最后只要观察 在仿射变换 下的像 是一个什么样的曲线就可以了。
定义仿射变换 :
不失一般性,这个仿射变换之所以这样定义,是希望能保持 轴不变,并且平移变换是不用考虑的:
即
带入到 中,
整理得
不考虑平移所带来的项,则函数实为如下形式
此为对勾函数曲线,即双曲线。
所以最后在三角形内形成的曲线应该是由三条双曲线拼合而成。效果图我之后补充。
##输入 #边长向量 ab=c(1,0) ac=c(2,1) bc=ac-ab #角度(可以通过内积计算,但是需要判断钝锐角,所以索性自己输入) A=atan(0.5) B=pi-atan(1) C=pi-A-B #密度 n=15 #画出三角形 x=c(0,ab[1],ac[1]) y=c(0,ab[2],ac[2]) plot(x,y,type='l') segments(0, 0, ac[1], ac[2], col= 'black') #模长 ml<-function(u) { sqrt(sum(u*u)) } #面积 S=det(matrix(c(ab,ac),2))/2 #中点 AB=ab/2 BC=(ab+ac)/2 CA=ac/2 #开口朝向a边的双曲线 for(i in 0:n) { K=S/sin(A) d=i/n/2*ml(ab) x=c(AB[1]+d,AB[2]) l=K/ml(x) y=c(l*ac/ml(ac),0) segments(x[1], x[2], y[1], y[2], col= 'red') } #开口朝向b边的双曲线 for(i in 0:n) { K=S/sin(B) d=i/n/2 x=c(BC[1]+d,BC[2]-tan(B)*d) l=K/x[2]*-cos(B) y=c(ml(ab)-l,0) segments(x[1], x[2] , y[1], y[2], col= 'red') } #开口朝向c边的双曲线 for(i in 0:n) { K=S/sin(C) d=i/n x=c(d,d*tan(A)) z=ml(ac-x) l=K/z y=ab+(ml(bc)-l)*bc/ml(bc) segments(x[1], x[2] , y[1], y[2], col= 'red') }