आप एक घन को एक गोले में कैसे बदलेंगे?


31

मैं एक लेख के आधार पर एक क्वाड क्षेत्र बनाने की कोशिश कर रहा हूं , जो इस तरह से परिणाम दिखाता है:

सही बात

मैं सही ढंग से एक क्यूब उत्पन्न कर सकता हूं:

से पहले

लेकिन जब मैं इस सूत्र के अनुसार सभी बिंदुओं को परिवर्तित करता हूं (ऊपर दिए गए पृष्ठ से):

सूत्र

    x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
    y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
    z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

मेरा क्षेत्र इस तरह दिखता है:

बाद

जैसा कि आप देख सकते हैं, क्यूब के किनारों अभी भी बहुत दूर प्रहार करते हैं। क्यूब सभी अक्षों से -1लेकर +1, जैसे लेख कहता है।

क्या गलत है इसका कोई आइडिया?


1
क्या आपके कार्यान्वयन में "x = x ..." समस्या भी है या यह सिर्फ यहीं है?
साँप ५

8
शानदार दृश्य एड्स। उन लोगों के लिए धन्यवाद
डोपेलग्रेनेर

2
शीर्षक में प्रश्न का उत्तर देने के लिए, आप इसे घन बनाने के लिए घन के कोने को सामान्य कर सकते हैं। शीर्षकों का वितरण संभवतः लिंक की गई विधि से भिन्न होगा।
10

जवाबों:


27

आपने सूत्र गलत लिखा है।

x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

आप मूल को संशोधित करते हैं xऔर इसे ओवरराइट करते हैं। फिर आप yमूल नहीं xबल्कि संशोधित के आधार पर संशोधित करते हैं x। फिर आप उन दोनों के zसंशोधित संस्करण के आधार पर संशोधित करते हैं।

मूल संरक्षित करें, और इसकी गणना करें:

float dx = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
float dy = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
float dz = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

तब से dx, dy और dz का उपयोग करें।


ओह। सोच नहीं रहा था
टॉम डेलिंग

क्या आपके पास उपरोक्त कार्यक्रम के लिए कोई नमूना स्रोत है?
वम्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.