รับมุมเป็นเรเดียนกำหนดจุดบนวงกลม


14

ฉันกำลังทำงานกับแป้นหมุนที่หมุนรอบวงกลม

ก่อนคลิก

ปุ่มหมุนนี้จะช่วยให้คุณสามารถย้ายที่ใดก็ได้ในวงกลมเพื่อปรับตำแหน่งของวงแหวนเป็นจุดบนวงกลมที่มีมุมเดียวกับการคลิก ตัวอย่างเช่นจากการหมุนด้านบนหากคุณคลิกจุดที่แสดงเป็นสีชมพูด้านล่างฉันจะย้ายการหมุนด้านบนจุดนั้น แต่ในวงกลม

หลังจากคลิก (สีชมพู)

ฉันรู้วิธีรับตำแหน่งของจุดบนวงกลมที่ให้รัศมีและมุม (เป็นเรเดียน) นั่นคือสูตรนี้ :

x = Cos(angle) * radius + CenterX;
y = Sin(angle) * radius + CenterY;

อย่างไรก็ตามฉันกำลังมองหาที่จะทำตรงกันข้าม - ฉันมีจุดคลิกที่ฉันต้องการที่จะกลายเป็นจุดบนวงกลม (ที่ปุ่มควบคุมไป) ฉันพยายามใช้จุดนี้ (และรัศมีที่กำหนด) เพื่อหามุมในหน่วยเรเดียนเพื่อให้ฉันสามารถวางปุ่มควบคุมบนวงกลมในมุมเดียวกัน

มีสูตรที่ใช้งานง่ายที่ฉันสามารถใช้เพื่อทำให้สิ่งนี้สำเร็จหรือไม่?


คุณกำลังมองหาสูตรเพื่อให้ได้มุมระหว่างถึงจุดหรือไม่?
William Mariager

คุณจะได้มุมระหว่างสองจุดหรือไม่? ฉันสามารถคำนวณความชันได้ แต่ฉันเดาว่าฉันต้องการจุดที่สามเพื่อสร้างรูปสามเหลี่ยมและใช้ฟังก์ชันตรีโกณมิติผกผันเพื่อแก้ปัญหานี้
บรรณาธิการ

ฉันโพสต์คำตอบเพื่อแสดงวิธีการ
William Mariager

3
สิ่งที่คุณมีตรงนี้คือมุมระหว่างเวกเตอร์สองตัว พวกเขาทั้งคู่มาจากจุดศูนย์กลางของวงกลมและมีขนาดเท่ากัน (รัศมีของวงกลม)
MichaelHouse

นี่คือคณิตศาสตร์ที่อยู่เบื้องหลังมัน: ฟังก์ชั่นหนุนผกผัน atanสั้นarctanและatan2เป็นเพียงฟังก์ชั่นที่ยอมรับการขัดแย้งกันและแบ่งให้คุณ
voithos

คำตอบ:


25

ลองใช้ฟังก์ชั่นatan2

มันให้มุมระหว่าง (0, 0) และ (x, y) xและyเป็นอาร์กิวเมนต์ของฟังก์ชัน

แก้ไข:ถ้าศูนย์กลางของวงกลมที่ไม่ (0, 0) atan2(y - cy, x - cx)ไม่ว่าเพียงแค่ทำสิ่งนี้:


มันไม่สำคัญว่าถ้าศูนย์กลางของวงกลมของฉันไม่ได้อยู่ที่(0,0)? ฉันเดาว่าฉันเพิ่งจะชดเชยข้อโต้แย้งatan2ตามที่แสดงโดย @Luis ด้านล่าง?
บรรณาธิการ

เพียงแปลโดยการลบ ดูการแก้ไข
jcora

3
-1: พารามิเตอร์แรกสำหรับ atan2 คือy
Luis Estrada

2
ขอบคุณ @LuisEstrada ฉันเพิ่งแก้ไขมัน (หวังว่าคุณจะทำให้มันเป็น +1 :))
jcora

+ หลุยส์เอสตราดาขออภัยที่จะทำสิ่งนี้ แต่ฉันต้องขอบคุณ ฉันพยายามดีบักโปรแกรมของฉันเป็นเวลาครึ่งวันแล้ว มันกลับกลายเป็นว่าข้อโต้แย้งatan2นั้นล้าหลัง!
Carcigenicate

8

คุณต้องมีจุดศูนย์กลางของปุ่มเวอร์และจุดเคอร์เซอร์พร้อมกับฟังก์ชั่นatan2 จากนั้นคุณใช้มันเช่นนี้:

 angle = atan2(mouseY - knobCenterY, mouseX - knobCenterX)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.