Tuvalde iki nokta arasındaki mesafeyi alın


103

Kanvas çizim sekmem var ve lineWidth'in son iki fare hareketi koordinat güncellemesi arasındaki mesafeyi temel almasını istiyorum. Mesafeyi genişliğe çevireceğim, sadece bu noktalar arasındaki mesafeyi nasıl elde edeceğimi bilmem gerekiyor (zaten bu noktaların koordinatlarına sahibim).

Yanıtlar:


211

Pisagor teoremi ile yapabilirsiniz

İki noktanız (x1, y1) ve (x2, y2) varsa, o zaman x'deki farkı ve y'deki farkı hesaplayabilirsiniz, hadi onlara a ve b diyelim.

görüntü açıklamasını buraya girin

var a = x1 - x2;
var b = y1 - y2;

var c = Math.sqrt( a*a + b*b );

// c is the distance

11
var c = Math.sqrt (a a + b b) ' yi kısaltabilirsiniz ; var c = Math.hypot (a, b);
evgpisarchik

2
a ^ 2 + b ^ 2 = c ^ 2 Hipotenus denklemi
Kad

Eğer giderseniz herhangi bir fark var mı x1 - x2, y1 - y2yoksa x2 - x1, y2 - y1?
Ramzan Chasygov

1
@RamzanChasygov Bu durumda hiçbir fark yoktur çünkü her değerin karesi alınır! Yani sipariş gibi olup olmadığını 7 - 5 = 2veya 5 - 7 = -2madde olmaz. -2 * -2 = 4 2 * 2 = 4
rdmurphy

167

Bunu not et Math.hypot ES2015 standardının bir parçası . Bu özellik için MDN belgesinde de iyi bir çoklu dolgu var .

Yani mesafeyi almak kadar kolay hale geliyor Math.hypot(x2-x1, y2-y1).



1

İki koordinat x ve y arasındaki mesafe! x1 ve y1 ilk nokta / konum, x2 ve y2 ikinci nokta / konum!

function diff (num1, num2) {
  if (num1 > num2) {
    return (num1 - num2);
  } else {
    return (num2 - num1);
  }
};

function dist (x1, y1, x2, y2) {
  var deltaX = diff(x1, x2);
  var deltaY = diff(y1, y2);
  var dist = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));
  return (dist);
};


Bunun Math.absyerine kullanmalısınız diff.
Moshe Simantov

3
diffBir sayının karesini almak her zaman pozitif bir sayı ile sonuçlanacaktır olarak kullanmanız gerekmez . Eğer x1 - y1negatif ise, (x1 - y1) ^ 2pozitif hala.
Redwolf Programları

0

Bu hesaplamayı yaptığım şeylerde çok kullanma eğilimindeyim, bu yüzden onu Math nesnesine eklemeyi seviyorum:

Math.dist=function(x1,y1,x2,y2){ 
  if(!x2) x2=0; 
  if(!y2) y2=0;
  return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); 
}
Math.dist(0,0, 3,4); //the output will be 5
Math.dist(1,1, 4,5); //the output will be 5
Math.dist(3,4); //the output will be 5

Güncelleme:

Bu yaklaşım özellikle buna benzer bir durumla karşılaştığınızda mutlu olur (sık sık yaparım):

varName.dist=Math.sqrt( ( (varName.paramX-varX)/2-cx )*( (varName.paramX-varX)/2-cx ) + ( (varName.paramY-varY)/2-cy )*( (varName.paramY-varY)/2-cy ) );

bu korkunç şey çok daha yönetilebilir hale geliyor:

varName.dist=Math.dist((varName.paramX-varX)/2, (varName.paramY-varY)/2, cx, cy);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.