นี่คือรายละเอียด อินพุตคือจุด P1 = (lat1, lon1) และ P2 = (lat2, lon2) บนพื้นผิวโลกซึ่งถือว่าเป็นทรงกลมและรัศมีสอง r1 และ r2 ที่สอดคล้องกัน
แปลงพิกัดละติจูด (lat, lon) เป็น (x, y, z) ตามปกติเพราะเราอาจเลือกหน่วยการวัดที่โลกมีรัศมีหน่วย
x = cos(lon) cos(lat)
y = sin(lon) cos(lat)
z = sin(lat).
ในตัวอย่าง P1 = (-90.234036 องศา, 37.673442 องศา) มีพิกัดทางภูมิศาสตร์ที่ x1 = (-0.00323306, -0.7915, 0.61116) และ P2 = (-90.953669 องศา, 36.109997 องศา) มีพิกัดทางภูมิศาสตร์ x2 = (-0.0134464, , 0.589337)
แปลง radii r1 และ r2 (ซึ่งวัดตามทรงกลม) เป็นมุมตามทรงกลม ตามคำนิยามหนึ่งไมล์ทะเล (NM) คือ 1/60 องศาของส่วนโค้ง (ซึ่งคือ pi / 180 * 1/60 = 0.0002908888 เรเดียน) ดังนั้นในมุม
r1 = 107.5 / 60 Degree = 0.0312705 radian
r2 = 145 / 60 Degree = 0.0421788 radian
เนื้อที่วงกลมรัศมี r1 รอบ X1 เป็นจุดตัดของพื้นผิวโลกที่มีที่ยุคลิดทรงกลมของบาปรัศมี (r1) ศูนย์กลางที่ cos (r1) * x1
ระนาบที่กำหนดโดยจุดตัดของทรงกลมของรัศมีบาป (r1) รอบ cos (r1) * x1 และพื้นผิวโลกตั้งฉากกับ x1 และผ่านจุด cos (r1) x1 ดังนั้นสมการของมันคือ x.x1 = cos (r1) ("." หมายถึงผลิตภัณฑ์ dot ปกติ ); เช่นเดียวกันกับระนาบอื่น จะมีจุดที่ไม่ซ้ำกัน x0 บนจุดตัดของระนาบทั้งสองนั่นคือการรวมกันเชิงเส้นของ x1 และ x2 กำลังเขียน x0 = a x1 + b * x2 สองสมการระนาบคือ
cos(r1) = x.x1 = (a*x1 + b*x2).x1 = a + b*(x2.x1)
cos(r2) = x.x2 = (a*x1 + b*x2).x2 = a*(x1.x2) + b
การใช้ความจริงที่ว่า x2.x1 = x1.x2 ซึ่งฉันจะเขียนเป็น q จะได้รับการแก้ปัญหา (ถ้ามี)
a = (cos(r1) - cos(r2)*q) / (1 - q^2),
b = (cos(r2) - cos(r1)*q) / (1 - q^2).
ในตัวอย่างการรันฉันคำนวณ a = 0.973503 และ b = 0.0260194
เห็นได้ชัดว่าเราต้องการ q ^ 2! = 1 ซึ่งหมายความว่า x1 และ x2 ไม่สามารถเป็นจุดเดียวกันหรือคะแนนตรงกันข้าม
ทีนี้ประเด็นอื่น ๆ ทั้งหมดในแนวการตัดกันของระนาบทั้งสองนั้นแตกต่างจาก x0 โดยพหุคูณของเวกเตอร์ n ซึ่งตั้งฉากกันกับระนาบทั้งสอง ผลิตภัณฑ์ข้าม
n = x1~Cross~x2
งานที่มีให้ไม่ใช่ n ไม่ใช่ศูนย์: อีกครั้งซึ่งหมายความว่า x1 และ x2 ไม่ได้เกิดขึ้นพร้อมกันหรือไม่ตรงกันข้าม (เราจำเป็นต้องระมัดระวังในการคำนวณผลิตภัณฑ์ครอสด้วยความแม่นยำสูงเพราะมันเกี่ยวข้องกับการลบด้วยการยกเลิกจำนวนมากเมื่อ x1 และ x2 อยู่ใกล้กัน) ในตัวอย่าง n = (0.0272194, -0.00631254, -0.00803124) .
ดังนั้นเราจึงหาจุดสองจุดของรูปแบบ x0 + t * n ซึ่งอยู่บนพื้นผิวโลกนั่นคือความยาวเท่ากับ 1 ความยาวความยาวกำลังสองเท่ากับ 1:
1 = squared length = (x0 + t*n).(x0 + t*n) = x0.x0 + 2t*x0.n + t^2*n.n = x0.x0 + t^2*n.n
คำที่มี x0.n จะหายไปเนื่องจาก x0 (เป็นการรวมกันเชิงเส้นของ x1 และ x2) ตั้งฉากกับ n ทั้งสองวิธีแก้ไขได้ง่าย ๆ
t = sqrt((1 - x0.x0)/n.n)
และลบ เรียกร้องให้มีความแม่นยำสูงอีกครั้งเพราะเมื่ออยู่ใกล้กับ x1 และ x2 x0.x0 นั้นใกล้เคียงกับ 1 มากทำให้สูญเสียความแม่นยำของจุดลอยตัว ในตัวอย่าง t = 1.07509 หรือ t = -1.07509 จุดตัดสองจุดจึงเท่ากัน
x0 + t*n = (0.0257661, -0.798332, 0.601666)
x0 - t*n = (-0.0327606, -0.784759, 0.618935)
ในที่สุดเราอาจแปลงโซลูชันเหล่านี้กลับเป็น (lat, lon) โดยแปลง geocentric (x, y, z) เป็นพิกัดทางภูมิศาสตร์:
lon = ArcTan(x,y)
lat = ArcTan(Sqrt[x^2+y^2], z)
สำหรับลองจิจูดใช้ค่าส่งคืนอาร์กแทนเจนต์แบบทั่วไปในช่วง -180 ถึง 180 องศา (ในแอปพลิเคชันการคำนวณฟังก์ชันนี้ใช้ทั้ง x และ y เป็นอาร์กิวเมนต์แทนที่จะเป็นอัตราส่วน y / x บางครั้งเรียกว่า "ATan2")
ฉันได้รับสองวิธีแก้ปัญหา (-88.151426, 36.989311) และ (-92.390485, 38.238380) ที่แสดงในรูปเป็นจุดสีเหลือง
แกนแสดงพิกัดทางภูมิศาสตร์ (x, y, z) แพทช์สีเทาเป็นส่วนหนึ่งของพื้นผิวโลกจาก -95 ถึง -87 องศาลองจิจูด, ละติจูด 33 ถึง 40 องศา (ทำเครื่องหมายปิดด้วยหนึ่งองศา graticule) พื้นผิวโลกถูกทำให้โปร่งใสบางส่วนเพื่อแสดงทรงกลมทั้งสาม ความถูกต้องของการแก้ปัญหาที่คำนวณนั้นเห็นได้ชัดว่าจุดสีเหลืองอยู่ที่จุดตัดของทรงกลม