ค้นหาพิกัดใหม่โดยใช้จุดเริ่มต้นระยะทางและมุม


12

ตกลงว่าฉันมีจุดประสานงาน

var coordinate = { x: 10, y: 20 };

ตอนนี้ฉันมีระยะทางและมุมหนึ่ง

var distance = 20;
var angle = 72;

ปัญหาที่ฉันพยายามแก้ไขคือถ้าฉันต้องการเดินทาง 20 คะแนนในทิศทางของมุมจากพิกัดเริ่มต้นฉันจะค้นหาพิกัดใหม่ของฉันได้อย่างไร

ฉันรู้ว่าคำตอบนั้นเกี่ยวข้องกับสิ่งต่าง ๆ เช่นไซน์ / โคไซน์เพราะฉันเคยรู้วิธีการทำสิ่งนี้ แต่ฉันลืมสูตรไปแล้ว ใครช่วยได้บ้าง


1
72 องศาจากอะไร แกน X แกน Y? อื่น ๆ อีก? ตามเข็มนาฬิกาทวนเข็มนาฬิกา?
pdr

@pdr 90 องศาจะเป็นทิศเหนือ, 45 องศาจะเป็นทิศตะวันออกเฉียงเหนือ, และอื่น ๆ
dqhendricks

คำตอบ:


5

SOHCAHTOA

ไซน์ = ตรงข้าม / ด้านตรงข้ามมุมฉากโคไซน์ = ติดกัน / ด้านตรงข้ามมุมฉากแทนเจนต์ = ตรงข้าม / ติดกัน

ในตัวอย่างของคุณ:

Sine(72) = Y/20 -> Y = Sine(72) * 20
Cosine(72) = X/20 -> X = Cosine(72) *20

ปัญหาคือคุณต้องระวังสิ่งที่คุณเป็น Quadrant สิ่งนี้ทำงานได้อย่างสมบูรณ์ใน Quadrant บนขวา แต่ไม่ดีนักในอีกสาม Quadrant


1
ใช้งานได้ในทุกด้าน สูตรเต็มรูปแบบสำหรับการหมุนเวกเตอร์ (X, Y) คือ X '= X * sin (มุม) + Y * cos (มุม) และ Y' = X * sin (มุม) + Y * -cos (มุม) สิ่งนี้จะลดความซับซ้อนของสิ่งที่คุณมีด้านบนเมื่อเพียงหมุนจากแกน x (1,0)
Chewy Gumball

อืม ... ข้าจำได้ไหมว่ามี gotcha เกี่ยวกับจตุภาค?
Dave Nay

2
โปรดทราบว่าใน javascript Math.sinและสิ่งที่คล้ายกันจะป้อนเป็นเรเดียนดังนั้นคุณจะต้องแปลง:radians = (degrees * (Math.PI/180)
Brian

1
@DaveNay คุณมีปัญหาเมื่อใช้ฟังก์ชัน Arc บาป (45degrees) = Sin (135degrees) ดังนั้น arcsin (sin (135degrees)) จะกลับมา 45 องศา Cos (45) = Cos (315) ...
mhoran_psprep

2

เพียงเพื่อบันทึกการปรับตัวจาวาสคริปต์จากMovable Type Scripts

function createCoord(coord, bearing, distance){
    /** http://www.movable-type.co.uk/scripts/latlong.html
     φ is latitude, λ is longitude, 
     θ is the bearing (clockwise from north), 
     δ is the angular distance d/R; 
     d being the distance travelled, R the earth’s radius*
     **/

    var 
        radius = 6371e3, //meters
        δ = Number(distance) / radius, // angular distance in radians
        θ = Number(bearing).toRad();
        φ1 = coord[1].toRad(),
        λ1 = coord[0].toRad();

    var φ2 = Math.asin(Math.sin1)*Math.cos(δ) + Math.cos1)*Math.sin(δ)*Math.cos(θ));

    var λ2 = λ1 + Math.atan2(Math.sin(θ)*Math.sin(δ)*Math.cos1), Math.cos(δ)-Math.sin1)*Math.sin2));

    λ2 = 2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180°

    return 2.toDeg(), φ2.toDeg()]; //[lon, lat]
}

Number.prototype.toDeg = function() { return this * 180 / Math.PI; }
Number.prototype.toRad = function() { return this * Math.PI / 180; }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.