วิธีที่ง่ายที่สุดในการคำนวณความโค้งหลักสำหรับสามเหลี่ยมตาข่ายคืออะไร?


19

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

สมมติว่าฉันรู้ตำแหน่งและบรรทัดฐานของทุกจุด

คำตอบ:


24

เมื่อฉันต้องการการประมาณค่าความโค้งของตาข่ายสำหรับสกินเชดเดอร์

ก่อนอื่นฉันคำนวณความโค้งแบบสเกลาร์สำหรับแต่ละขอบในตาข่าย หากขอบมีตำแหน่งและ normalsดังนั้นฉันประเมินความโค้งเป็น:n 1 , n 2พี1,พี2n1,n2

ความโค้ง=(n2-n1)(พี2-พี1)|พี2-พี1|2

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

จากนั้นสำหรับแต่ละจุดสุดยอดฉันดูที่ความโค้งของขอบทั้งหมดที่สัมผัสมัน ในกรณีของฉันฉันแค่ต้องการประมาณค่าสเกลาร์ของ "ความโค้งเฉลี่ย" ดังนั้นฉันจึงลงเอยด้วยการใช้ค่าเฉลี่ยทางเรขาคณิตของค่าสัมบูรณ์ของความโค้งของขอบทั้งหมดในแต่ละจุดยอด สำหรับกรณีของคุณคุณอาจพบความโค้งต่ำสุดและสูงสุดและนำขอบเหล่านั้นไปเป็นทิศทางความโค้งหลัก (อาจเป็นการเปลี่ยนมุมฉากของพวกมันด้วยจุดยอดปกติ) ค่อนข้างหยาบ แต่อาจให้ผลลัพธ์ที่ดีพอสำหรับสิ่งที่คุณต้องการ


แรงจูงใจสำหรับสูตรนี้คือการดูว่าเกิดอะไรขึ้นในแบบ 2D เมื่อใช้กับวงกลม:

สูตรความโค้งใช้กับจุดสองจุดบนวงกลม

สมมติว่าคุณมีวงกลมรัศมี (เพื่อความโค้งของมันคือ ) และคุณมีจุดสองจุดบนวงกลมที่มีภาวะปกติของพวกเขาn_2 ตำแหน่งของจุดสัมพันธ์กับจุดศูนย์กลางของวงกลมจะเป็นและเนื่องจากคุณสมบัติที่วงกลมหรือทรงกลมชี้ตรงออกจากจุดศูนย์กลางเสมอ1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2R1/Rn1,n2พี1=Rn1พี2=Rn2

ดังนั้นคุณสามารถกู้รัศมีได้เป็นหรือ. แต่โดยทั่วไปตำแหน่งจุดสุดยอดจะไม่สัมพันธ์กับจุดศูนย์กลางของวงกลม เราสามารถแก้ไขได้โดยการลบสอง: | หน้า2 | / | ไม่มี2 | หน้า2 - หน้า1R=|พี1|/|n1||พี2|/|n2|

พี2-พี1=Rn2-Rn1=R(n2-n1)R=|พี2-พี1||n2-n1|ความโค้ง=1R=|n2-n1||พี2-พี1|

ผลลัพธ์จะถูกต้องเฉพาะกับแวดวงและทรงกลมเท่านั้น อย่างไรก็ตามเราสามารถขยายเพื่อให้ "อดทน" อีกเล็กน้อยและใช้กับตาข่าย 3D โดยพลการและดูเหมือนว่าจะทำงานได้ดีพอสมควร เราสามารถทำให้สูตรมากขึ้น "ใจกว้าง" เป็นครั้งแรกโดยการฉายเวกเตอร์สู่ทิศทางของขอบที่P_1 วิธีนี้ช่วยให้เวกเตอร์สองตัวนี้ไม่ขนานกันอย่างแน่นอน (เหมือนในกรณีวงกลม); เราจะฉายส่วนประกอบใด ๆ ที่ไม่ขนานกัน เราสามารถทำสิ่งนี้ได้ด้วยการกระจายเวกเตอร์ขอบ: p 2 - p 1 ความโค้งn2-n1พี2-พี1

curvature=(n2n1)normalize(p2p1)|p2p1|=(n2n1)(p2p1)/|p2p1||p2p1|=(n2n1)(p2p1)|p2p1|2

อีกครั้ง, มีสูตรที่ปรากฏที่ด้านบนของคำตอบนี้. ข้อดีข้างเคียงที่ดีของการใช้โปรเจคชั่นที่เซ็นชื่อ (ผลิตภัณฑ์ดอท) คือสูตรนั้นให้ความโค้งที่มีลายเซ็น: บวกสำหรับนูนและลบสำหรับพื้นผิวเว้า


อีกวิธีที่ฉันสามารถจินตนาการได้ แต่ไม่ได้ลองคือการประมาณรูปแบบพื้นฐานที่สองของพื้นผิวในแต่ละจุดยอด สิ่งนี้สามารถทำได้โดยการตั้งค่าพื้นฐานแทนเจนต์ที่จุดสุดยอดจากนั้นแปลงจุดยอดที่อยู่ใกล้เคียงทั้งหมดเป็นพื้นที่แทนเจนต์นั้นและใช้กำลังสองน้อยที่สุดเพื่อหาเมทริกซ์ 2FF ที่ดีที่สุด จากนั้นทิศทางความโค้งหลักจะเป็นค่าเฉพาะของเมทริกซ์นั้น สิ่งนี้น่าสนใจเพราะคุณสามารถหาทิศทางความโค้ง "โดยนัย" ของจุดยอดที่อยู่ใกล้เคียงโดยไม่มีขอบใด ๆ ชี้ไปในทิศทางนั้นอย่างชัดเจน แต่ในทางกลับกันก็คือรหัสที่มากขึ้นการคำนวณที่มากขึ้น

กระดาษที่ใช้วิธีนี้คือRusinkiewicz "ประมาณโค้งและอนุพันธ์ของพวกเขาในสามเหลี่ยมตาข่าย" มันทำงานได้โดยการประมาณเมทริกซ์ 2FF ที่ดีที่สุดต่อสามเหลี่ยมแล้วเฉลี่ยเมทริกซ์ต่อจุดสุดยอด (คล้ายกับวิธีการคำนวณบรรทัดฐานแบบเรียบ)


1
FYI ถ้าเป็นเช่นนั้นฉันได้ใช้คำตอบของคุณที่นี่blender.stackexchange.com/questions/146819/แต่เพิ่มน้ำหนักโดยใช้มุมประมาณ p1 ไม่ทราบว่าคุณพบว่ามีค่าหรือไม่ อย่างไรก็ตามโปรดแสดงความคิดเห็น ขอบคุณ
เลมอน

19

เพียงเพิ่มอีกวิธีหนึ่งในคำตอบ @NathanReed ที่ยอดเยี่ยมคุณสามารถใช้ค่าเฉลี่ยและความโค้งแบบเกาส์เซียนที่สามารถรับได้ด้วย Laplace-Beltrami แบบแยก

สมมติว่าย่าน 1-ring ของใน mesh ของคุณมีลักษณะเช่นนี้โวลต์ผม

                                         ป้อนคำอธิบายรูปภาพที่นี่

1A(โวลต์ผม)สามารถเป็นของพื้นที่สามเหลี่ยมที่เกิดวงแหวนนี้และระบุเป็นหนึ่งในจุดยอดที่อยู่ใกล้เคียง vj13โวลต์J

ทีนี้ลองเรียกฟังก์ชั่นที่กำหนดโดย mesh ของคุณ (จะต้องเป็น manifold ที่สามารถหาอนุพันธ์ได้) ณ จุดหนึ่ง การแยกส่วนที่เป็นที่นิยมมากที่สุดของโอเปอเรเตอร์ Laplace-Beltrami ที่ฉันรู้คือการแยกส่วนโคแทนเจนต์และได้รับจาก:(โวลต์ผม)

ΔS(โวลต์ผม)=12A(โวลต์ผม)Σโวลต์Jยังไม่มีข้อความ1(โวลต์ผม)(โอเสื้อαผมJ+โอเสื้อβผมJ)((โวลต์J)-(โวลต์ผม))

ที่ไหนหมายถึงจุดสุดยอดทุกในย่านแหวนหนึ่งv_iโวลต์Jยังไม่มีข้อความ1(โวลต์ผม)โวลต์ผม

ด้วยวิธีนี้ค่อนข้างง่ายในการคำนวณค่าเฉลี่ยความโค้ง (ตอนนี้เพื่อความง่ายเรามาเรียกฟังก์ชันของ mesh ที่จุดยอดที่น่าสนใจอย่างง่ายๆ ) คือโวลต์

H=12||ΔSโวลต์||

ตอนนี้เราจะแนะนำมุมเป็นθJ

                                        ป้อนคำอธิบายรูปภาพที่นี่

ความโค้งของเกาส์เซียนคือ:

K=(2π-ΣJθJ)/A

หลังจากความเจ็บปวดทั้งหมดนี้ความโค้งที่ไม่ต่อเนื่องหลักได้รับจาก:

k1=H+H2-K  และ  k2=H-H2-K

หากคุณมีความสนใจในเรื่อง (และเพื่อเพิ่มการอ้างอิงถึงโพสต์นี้) การอ่านที่ยอดเยี่ยมคือ: ตัวดำเนินการ แยกความแตกต่าง - เรขาคณิตสำหรับสามเหลี่ยมสอง Manifolds [เมเยอร์และคณะ 2003]

สำหรับภาพฉันขอขอบคุณอดีตศาสตราจารย์ Niloy Mitra เนื่องจากฉันพบพวกเขาในบันทึกย่อบางอย่างที่ฉันใช้ในการบรรยาย


คำตอบทั้งสองนั้นดีมากมันยากสำหรับฉันที่จะเลือก ตั้งแต่ฉันถามถึงวิธีที่ง่ายที่สุดฉันคิดว่านาธานรับเค้ก
ap_

2
K=(π-ΣJθJ)/Aม.ผมxอีd

@teodron คุณมีข้อมูลเชิงลึกเกี่ยวกับความโค้งเฉลี่ยของจุดยอดขอบหรือไม่ สิ่งนี้สามารถกำหนดได้หรือไม่?
รำพึง

โวลต์ผม

-1

@ Nathan-Reed: เพียงแค่คำถามสำหรับคำตอบของ Nathan-Reed: ทำไมคุณถึงใช้รูปทรงเรขาคณิต? นั่นเป็นเพราะมันเป็น "แบบจำลอง" หลังจากความโค้งของเกาส์เซียนหรือไม่?


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