2015-05-23 141 views
-2

我想计算一个倒圆的半径。倒圆半径计算

我设法实现了一切,但经过数小时的努力之后,我找不到一个公式来计算正确的反转半径。约一圈反转

更多信息:

我迄今为止代码:http://codepen.io/rafaelcastrocouto/pen/Mwjdga

这似乎是工作,但你可以很容易分辨出它是完全错误的。

var c = $('#c'), 
    b = $('body'), 
    canvas = c[0], 
    ctx = canvas.getContext('2d'), 
    pi = Math.PI, 
    r = 100, 
    mr = 30, 
    width, height, hw, hh; 
var setup = function() { 
    width = b.width(); 
    height = b.height(); 
    hw = width/2; 
    hh = height/2; 
    canvas.width = width; 
    canvas.height = height; 
    mid(); 
}; 
var mid = function() { 
    circle(hw,hh,0.25); 
    circle(hw,hh,r); 
} 
var circle = function(x,y,r) { 
    ctx.beginPath(); 
    ctx.arc(x,y,r,0,pi*2); 
    ctx.stroke(); 
    ctx.closePath(); 
}; 
var move = function(evt) { 
    var x = evt.clientX, 
     y = evt.clientY; 
    ctx.clearRect(0,0,width,height); 
    mid(); 
    circle(x,y,mr); 
    var dx = x-hw, 
     dy = y-hh, 
     d = dist(dx,dy), 
     nd = r*r/d, 
     nx = dx*nd/d, 
     ny = dy*nd/d, 
     nr = mr*mr*pi/d; // whats the correct formula? 
    console.log(nr); 
    circle(nx+hw, ny+hh, nr); 
}; 
var dist = function(x,y) { 
    return Math.pow(x*x + y*y, 1/2); 
}; 
$(setup); 
$(window).resize(setup); 
$(window).mousemove(move); 

需要数学专家的帮助!

+1

你能解释一下你实际上是试图做的,用文字请。 – Teemu

+0

“我想计算一个反射圆的半径”..抱歉,但我不能更清楚... – rafaelcastrocouto

+0

你必须更清楚:这是一个26分钟的视频链接到。你至少可以孤立描述你在想什么的时代。或尝试找到不同的网站链接。 – Richard

回答

0

我的错误是,我假设倒圆的中心也遵守OP x OP'= r ,但如下图所示,它显然没有。解决方法是计算圆上的两个点并反映每个点,然后使用这些点之间的一半距离来查找半径。

enter image description here

因此,这是正确的代码:

var c = $('#c'), 
 
     b = $('body'), 
 
     canvas = c[0], 
 
     ctx = canvas.getContext('2d'), 
 
     pi = Math.PI, 
 
     r = 100, 
 
     mr = 30, 
 
     width, height, hw, hh; 
 

 
var setup = function() { 
 
    width = b.width(); 
 
    height = b.height(); 
 
    hw = width/2; 
 
    hh = height/2; 
 
    canvas.width = width; 
 
    canvas.height = height; 
 
    mid(); 
 
}; 
 
var mid = function() { 
 
    circle(hw,hh,0.25); 
 
    circle(hw,hh,r); 
 
} 
 
var circle = function(x,y,r) { 
 
    ctx.beginPath(); 
 
    ctx.arc(x,y,r,0,pi*2); 
 
    ctx.stroke(); 
 
    ctx.closePath(); 
 
}; 
 
var move = function(evt) { 
 
    var x = evt.clientX, 
 
     y = evt.clientY; 
 
    ctx.clearRect(0,0,width,height); 
 
    mid(); 
 
    circle(x,y,mr); 
 
    var dx = x-hw, 
 
     dy = y-hh, 
 
     d = dist(dx,dy), 
 
     d1 = d - mr, 
 
     d2 = d + mr, 
 
     nd1 = r*r/d1, 
 
     nd2 = r*r/d2, 
 
     a = Math.atan2(dy,dx), 
 
     dx1 = Math.cos(a) * nd1, 
 
     dy1 = Math.sin(a) * nd1, 
 
     dx2 = Math.cos(a) * nd2, 
 
     dy2 = Math.sin(a) * nd2, 
 
     nd = dist(dx1 - dx2, dy1 - dy2),  
 
     nr = nd/2, 
 
     cx = dx1 - (Math.cos(a) * nr), 
 
     cy = dy1 - (Math.sin(a) * nr); 
 
    circle(cx+hw, cy+hh, nr); 
 
}; 
 
var dist = function(x,y) { 
 
    return Math.pow(x*x + y*y, 1/2); 
 
}; 
 
$(setup); 
 
$(window).resize(setup); 
 
$(window).mousemove(move);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<canvas id="c"></canvas>