मधुमक्खी के साथ दो ग्रहों के बीच चलते जहाज, त्वरण के लिए कुछ समीकरणों को याद करते हुए


48

ठीक है, मैंने पहले ही math.stackechange.com पर यह पोस्ट कर दिया था, लेकिन कोई जवाब नहीं मिला :(

यहाँ पहले मेरी समस्या का चित्र है, विवरण इस प्रकार है:

वैकल्पिक शब्द

इसलिए मुझे सभी बिंदु और मूल्य मिल गए।

जहाज प्रति युग्मक के P1साथ बाएं ग्रह के चारों ओर घूमना शुरू कर S=0.27 Degreesदेता है, जब यह पहुंचता है तब तक Point Aयह बेज वक्र का अनुसरण करना शुरू कर देता है Point D, तब तक यह प्रति ग्रह टिक के P2साथ दाहिने ग्रह के चारों ओर यात्रा करता है S=0.42 Degrees। अंतर Sइतना है कि ग्रहों के चारों ओर एक ही गति के साथ यात्रा होती है।

अब तक तो अच्छा है, मुझे लगता है कि ऊपर और चल रहा है, अब मेरी समस्या है।

जब S P1और जब S P2बहुत अलग होता है, तो जहाज दो गति के बीच कूदता है जब वह गंतव्य तक पहुंचता है, जो बहुत बुरा लगता है। इसलिए मैं के बीच जहाज में तेजी लाने की जरूरत है Point Aऔर Point Dसे S P1करने के लिए S P2

जो चीज़ मुझे याद आ रही है वो बैंगनी रंग की है, वो हैं:

  • टिक्स की गणना करने का एक तरीका यह जहाज को त्वरण को देखते हुए बेजियर के साथ आगे बढ़ने के लिए लेता है।

  • और टी के आधार पर बीज़ियर वक्र पर स्थिति खोजने का एक तरीका, फिर से त्वरण पर विचार करना।

एटीएम I Nअपने अंकों के बीच की दूरी की गणना करके बेज़ियर की लंबाई की गणना करता है । तो मुझे क्या लगता है कि मुझे जरूरत है, Tत्वरण के अनुसार मुझे अपने बीज़ियर गणना में डालने की आवश्यकता है।


2
यह पता लगाने पर अच्छा काम। मेरा सुझाव है कि आप अपने निष्कर्षों को अपने प्रश्न के उत्तर के रूप में पोस्ट करें।
बुमज़ैक

जवाबों:


83

ठीक है, मुझे सब कुछ काम मिल गया है, यह हमेशा के लिए हो गया है, इसलिए मैं यहां अपना विस्तृत समाधान पोस्ट करने जा रहा हूं।
नोट: सभी कोड नमूने जावास्क्रिप्ट में हैं।

तो चलो बुनियादी भागों में समस्या को तोड़ते हैं:

  1. आपको लंबाई की गणना करने की आवश्यकता है, साथ ही 0..1बीज़ियर वक्र पर बिंदुओं के बीच भी

  2. अब आपको Tजहाज की गति को एक गति से दूसरी गति तक बढ़ाने के लिए अपने स्केलिंग को समायोजित करने की आवश्यकता है

बेजियर सही हो रहा है

बेजियर कर्व ड्राइंग के लिए कुछ कोड ढूंढना आसान है, हालांकि कई अलग-अलग दृष्टिकोण हैं, उनमें से एक है डेकास्टेलजौ एल्गोरिदम , लेकिन आप बस क्यूबिक बेज़ियर कर्व्स के समीकरण का उपयोग कर सकते हैं :

// Part of a class, a, b, c, d are the four control points of the curve
x: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
           + 3 * ((1 - t) * (1 - t)) * t * this.b.x
           + 3 * (1 - t) * (t * t) * this.c.x
           + (t * t * t) * this.d.x;
},

y: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
           + 3 * ((1 - t) * (1 - t)) * t * this.b.y
           + 3 * (1 - t) * (t * t) * this.c.y
           + (t * t * t) * this.d.y;
}

इसके साथ, एक अब कॉल करके एक बीज़ियर वक्र खींच सकता है xऔर जिसके yसाथ tसीमाएं हैं 0 to 1, आइए एक नज़र डालें:

वैकल्पिक शब्द

उह ... यह वास्तव में अंकों का वितरण भी नहीं है, क्या यह है?
बेज़ियर वक्र की प्रकृति के कारण, अंक 0...1अलग-अलग होते हैं arc lenghts, इसलिए शुरुआत और अंत के पास खंड, उन लोगों की तुलना में अधिक लंबे होते हैं जो वक्र के मध्य के पास होते हैं।

मानचित्रण T समान रूप से वक्र AKA चाप-लंबाई परिमाणीकरण पर

इसलिए क्या करना है? अच्छी तरह से सरल शब्दों में, हमें वक्र Tपर अपना नक्शा बनाने के लिए एक फ़ंक्शन की आवश्यकता होती है t, ताकि हमारे T 0.25परिणाम tउस पर हों25% की लंबाई ।

हम यह कैसे करे? ठीक है, हम Google ... लेकिन यह पता चला है कि यह शब्द उस googleable नहीं है , और कुछ बिंदु पर आप इस पीडीएफ को मारेंगे । जो निश्चित रूप से एक महान पढ़ा है, लेकिन इस मामले में कि आप पहले से ही स्कूल में सीखे गए सभी गणित के सामान को भूल गए हैं (या आप सिर्फ उन गणितीय प्रतीकों को पसंद नहीं करते हैं) यह बहुत बेकार है।

अब क्या? ठीक है, और Google पर कुछ और पढ़ें (पढ़ें: 6 घंटे), और आपको अंत में विषय पर एक अच्छा लेख मिल जाएगा (अच्छी तस्वीर सहित! ^ _ ^ "):
Http://www.planetclegg.com/projects/WarpingTextToSplines.html

वास्तविक कोड करना

यदि आप अभी उस पीडीएफ को डाउनलोड करने का विरोध नहीं कर सकते हैं, हालांकि आप पहले से ही अपना गणितीय ज्ञान खो चुके हैं, बहुत समय पहले, (और आप महान लेख लिंक को छोड़ देने में कामयाब रहे ), तो अब आप सोच सकते हैं: "भगवान, यह लगेगा कोड और CPU की टन की सैकड़ों लाइनें "

नहीं यह नहीं होगा। क्योंकि हम वह सब करते हैं जो प्रोग्रामर करते हैं, जब गणित की सामग्री आती है:
हम बस धोखा देते हैं।

आर्क-लंबाई पैरामीटर, आलसी तरीका

चलो इसका सामना करते हैं, हमें अपने खेल में अंतहीन सटीकता की आवश्यकता नहीं है, क्या हम? इसलिए जब तक आप नासा में काम नहीं कर रहे हैं और लोगों को मंगल ग्रह पर भेजने की योजना बना रहे हैं, आपको एक 0.000001 pixelसही समाधान की आवश्यकता नहीं होगी ।

तो हम नक्शा कैसे Tबनाते हैं t? यह सरल है और इसमें केवल 3 चरण हैं:

  1. Nवक्र पर बिंदुओं की गणना करें tऔर arc-lengthउस स्थिति में (वक्र की लंबाई उर्फ) को एक सरणी में संग्रहीत करें

  2. मैप Tकरने के लिए t, पहले Tवक्र की कुल लंबाई से गुणा uकरें और फिर सबसे बड़े मान के सूचकांक के लिए लंबाई की सरणी खोजें।u

  3. यदि हमारे पास एक सटीक हिट था N, तो उस इंडेक्स पर ऐरे वैल्यू को विभाजित करके लौटाएं , यदि हमें मिले बिंदु और अगले एक के बीच में थोड़ा सा भी इंटरपोलेट नहीं है , तो उस चीज़ को एक बार फिर से विभाजित करके Nवापस आ जाएं।

बस इतना ही! तो चलिए अब पूरा कोड देख लेते हैं:

function Bezier(a, b, c, d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;

    this.len = 100;
    this.arcLengths = new Array(this.len + 1);
    this.arcLengths[0] = 0;

    var ox = this.x(0), oy = this.y(0), clen = 0;
    for(var i = 1; i <= this.len; i += 1) {
        var x = this.x(i * 0.05), y = this.y(i * 0.05);
        var dx = ox - x, dy = oy - y;        
        clen += Math.sqrt(dx * dx + dy * dy);
        this.arcLengths[i] = clen;
        ox = x, oy = y;
    }
    this.length = clen;    
}

यह हमारे नए वक्र को आरंभीकृत करता है और गणना करता है arg-lenghts, यह लंबाई के अंतिम total lengthभाग को वक्र के रूप में संग्रहीत करता है , यहाँ प्रमुख कारक this.lenजो हमारा है N। अधिक, मैपिंग जितना सटीक होगा, ऊपर की तस्वीर में आकार के एक वक्र के लिए 100 pointsपर्याप्त प्रतीत होता है, अगर आपको केवल एक अच्छी लंबाई के अनुमान की आवश्यकता है, तो कुछ 25ऐसा पहले से ही केवल 1 पिक्सेल बंद होने के साथ काम करेगा। उदाहरण, लेकिन तब आपके पास एक कम सटीक मानचित्रण होगा जिसके परिणामस्वरूप Tमैप किए जाने पर भी वितरण नहीं होगा t

Bezier.prototype = {
    map: function(u) {
        var targetLength = u * this.arcLengths[this.len];
        var low = 0, high = this.len, index = 0;
        while (low < high) {
            index = low + (((high - low) / 2) | 0);
            if (this.arcLengths[index] < targetLength) {
                low = index + 1;

            } else {
                high = index;
            }
        }
        if (this.arcLengths[index] > targetLength) {
            index--;
        }

        var lengthBefore = this.arcLengths[index];
        if (lengthBefore === targetLength) {
            return index / this.len;

        } else {
            return (index + (targetLength - lengthBefore) / (this.arcLengths[index + 1] - lengthBefore)) / this.len;
        }
    },

    mx: function (u) {
        return this.x(this.map(u));
    },

    my: function (u) {
        return this.y(this.map(u));
    },

वास्तविक मैपिंग कोड, सबसे पहले हम binary searchअपनी संग्रहीत लंबाई पर एक सरल करते हैं और फिर सबसे बड़ी लंबाई का पता लगाते हैं targetLength, फिर हम सिर्फ प्रक्षेप करते हैं या वापस लौटते हैं।

    x: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
               + 3 * ((1 - t) * (1 - t)) * t * this.b.x
               + 3 * (1 - t) * (t * t) * this.c.x
               + (t * t * t) * this.d.x;
    },

    y: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
               + 3 * ((1 - t) * (1 - t)) * t * this.b.y
               + 3 * (1 - t) * (t * t) * this.c.y
               + (t * t * t) * this.d.y;
    }
};

फिर से यह tवक्र पर गणना करता है।

परिणामों के लिए समय

वैकल्पिक शब्द

अब तक का उपयोग करके mxऔर myआप Tवक्र पर समान रूप से वितरित हो जाते हैं :)

क्या यह मुश्किल नहीं था? एक बार फिर, यह पता चलता है कि एक सरल (हालांकि सही समाधान नहीं) एक खेल के लिए पर्याप्त होगा।

यदि आप पूरा कोड देखना चाहते हैं, तो एक Gist उपलब्ध है:
https://gist.github.com/670236

अंत में, जहाजों को तेज करना

तो अब जो कुछ बचा है, वह अपने रास्ते के साथ जहाजों को तेज करना है, उस स्थिति की मैपिंग करके, Tजिस पर हम tअपने वक्र को खोजने के लिए उपयोग करते हैं ।

पहले हमें गति के दो समीकरणों की आवश्यकता होती है , अर्थात् ut + 1/2at²और(v - u) / t

वास्तविक कोड में जो इस तरह दिखेगा:

startSpeed = getStartingSpeedInPixels() // Note: pixels
endSpeed = getFinalSpeedInPixels() // Note: pixels
acceleration = (endSpeed - startSpeed) // since we scale to 0...1 we can leave out the division by 1 here
position = 0.5 * acceleration * t * t + startSpeed * t;

फिर हम उस पैमाने को नीचे 0...1कर रहे हैं:

maxPosition = 0.5 * acceleration + startSpeed;
newT = 1 / maxPosition * position;

और वहाँ तुम जाओ, जहाज अब आसानी से पथ के साथ आगे बढ़ रहे हैं।

मामले में यह काम नहीं करता है ...

जब आप इसे पढ़ रहे होते हैं, तो सब कुछ ठीक और बांका काम करता है, लेकिन मुझे शुरू में त्वरण भाग के साथ कुछ समस्याएं थीं, जब किसी समस्या को समझाते हुए gamedev chatroom में मैंने अपनी सोच में अंतिम त्रुटि पाई।

यदि आप मूल प्रश्न में चित्र के बारे में पहले से ही नहीं भूले हैं, तो मैं sवहां उल्लेख करता हूं , यह पता चला है कि डिग्रीs में गति है , लेकिन जहाज पिक्सेल में पथ के साथ चलते हैं और मैं उस तथ्य के बारे में भूल गया था। तो इस मामले में मुझे जो करने की आवश्यकता थी, वह था विस्थापन को डिग्री में पिक्सेल में विस्थापन में बदलना, यह बताता है कि यह आसान है:

function rotationToMovement(planetSize, rotationSpeed) {
    var r = shipAngle * Math.PI / 180;
    var rr = (shipAngle + rotationSpeed) * Math.PI / 180;
    var orbit = planetSize + shipOrbit;
    var dx = Math.cos(r) * orbit - Math.cos(rr) * orbit;
    var dy = Math.sin(r) * orbit - Math.sin(rr) * orbit;
    return Math.sqrt(dx * dx + dy * dy);
};

तो और यह सब है! पढ़ने के लिए धन्यवाद ;)


7
यह पचने में थोड़ा समय लेने वाला है। लेकिन वाह, अपने ही सवाल का अद्भुत जवाब।
अटैकिंगहोबो

7
मैंने इस उत्तर को उकेरने के लिए सिर्फ एक खाता बनाया है
कोई भी

कुछ बिंदु मेरे दोस्त है एक जादू की तरह काम किया। प्रश्न और उत्तर दोनों अपवोट।
जेस

2
'i' को 0.05 से गुणा किया जाता है, जबकि 'len' को 100 पर सेट किया गया था। इस 't' को '0-1' के बजाय '0-5' पर मैप किया जाएगा।
ईविल एक्टिविटी

1
@EvilActivity हाँ मैंने देखा कि उसकी मूल लंबाई भी 20 रही होगी, फिर 0.05 से 0.01 बदलना भूल गया। इसलिए बेहतर है कि एक गतिशील 'लेन' (वास्तविक आर्क लंबाई के अनुकूल हो, या शायद इसके बराबर भी हो), और 1 / 'लेन' द्वारा "चरण" की गणना करें। मुझे लगता है कि यह इतना अजीब है किसी और ने इन सभी वर्षों में लाया है !!!
बिल कोट्सियास

4

मुद्दा यह है कि एक जहाज स्वाभाविक रूप से उस प्रक्षेपवक्र को नहीं लेगा। तो यह भी पूरी तरह से काम के साथ यह अभी भी सही नहीं लगेगा।

यदि आप ग्रहों के बीच सुचारु परिवर्तन का अनुकरण करना चाहते हैं तो मैं वास्तव में इसे मॉडलिंग करने का सुझाव दूंगा। समीकरण बहुत सरल हैं क्योंकि आपके पास केवल दो महत्वपूर्ण बल हैं: गुरुत्वाकर्षण और जोर।

आपको बस अपने स्थिरांक सेट करने की आवश्यकता है: पी 1 का द्रव्यमान, पी 2, जहाज

प्रत्येक गेम-टिक (समय: टी) के साथ आप 3 चीजें कर रहे हैं

  1. जहाज पर पी 1 और जहाज पर पी 2 के गुरुत्वाकर्षण की गणना करें, परिणामी वैक्टर को जोर वेक्टर में जोड़ें।

  2. चरण 1 से अपने नए त्वरण के आधार पर अपने नए वेग की गणना करें

  3. अपने नए वेग के अनुसार जहाज को हिलाएं

बहुत काम की तरह लग सकता है लेकिन यह कोड की एक दर्जन लाइनों में किया जा सकता है और बहुत स्वाभाविक लगेगा।

अगर आपको भौतिकी की मदद चाहिए तो मुझे बताएं।


मैं परीक्षण पर विचार कर सकता हूं कि यदि आप किसी फ़ंक्शन के भीतर ऐसा करने का एक तरीका प्रदान कर सकते हैं t:)
Ivo Wetzel

-लेकिन गेम प्रोग्रामिंग में आप t को वेरिएबल के रूप में उपयोग नहीं करते हैं। आप पहले से ही मूल रूप से एक पैरामीट्रिक स्थिति में हैं, क्योंकि आप बस जहाज के लिए नए डीएक्स और डाई की गणना कर रहे हैं। यहाँ दो ग्रहों की परिक्रमा करने का एक उदाहरण है (Flash में) aharrisbooks.net/flash/fg2r12/twoPlanets.html - और यहाँ Python में भी यही बात है: aharrisbooks.net/pythoname/ch09/twoPlanets.py
दो pi

2

मुझे जावास्क्रिप्ट में लिखे एक कोड उदाहरण के साथ इस समस्या के संभावित समाधान की व्याख्या करते हुए एक उत्कृष्ट लेख मिला । यह सही दिशा में "t nudging" मान द्वारा काम करता है।

इसके बजाय, हम इस तथ्य का उपयोग कर सकते हैं कि किसी भी डॉट वितरण के लिए औसत पैर की लंबाई d_avg लगभग पैर की लंबाई के समान है जो समान रूप से-स्थान वाले डॉट्स का उत्पादन करेगा (यह समानता n बढ़ जाती है)। यदि हम वास्तविक पैर की लंबाई d और औसत पैर की लंबाई d_avg के बीच अंतर d_err की गणना करते हैं, तो इस अंतर को कम करने के लिए प्रत्येक बिंदु के अनुरूप समय पैरामीटर t nudged जा सकता है।

इस सवाल का पहले से ही बहुत ठंडा जवाब है, लेकिन मैंने इस समाधान को ध्यान देने योग्य पाया।


1

आपके उत्कृष्ट पृष्ठ का वर्णन करने के लिए धन्यवाद कि आपने इस समस्या को कैसे हल किया। मैंने एक विस्तार में आपसे कुछ अलग किया, जैसा कि मैं गहराई से याद किया गया था: मैं एक सरणी का निर्माण नहीं करता हूं, या इसे बाइनरी खोज के साथ सही 'सेगमेंट' के लिए खोजना है। ऐसा इसलिए है क्योंकि मुझे हमेशा से पता है कि मैं अपने बेजियर वक्र के एक छोर से दूसरे हिस्से में जा रहा हूं: इसलिए, मुझे बस 'करंट' सेगमेंट याद है, और अगर मुझे लगता है कि मैं अपनी अगली गणना करने के लिए उस सेगमेंट की सीमा से बाहर जा रहा हूं स्थिति, मैं अगले (या पिछले) खंड (यात्रा की दिशा के आधार पर) की गणना करता हूं। यह मेरे आवेदन के लिए काफी अच्छा काम करता है। मुझे केवल इतना गड़बड़ करना था कि कुछ वक्रों में, खंडों का आकार इतना छोटा था कि मेरा अगला बिंदु इंगित करने के लिए था - दुर्लभ समय में - वर्तमान खंड के आगे एक से अधिक खंड, इसलिए केवल जाने के बजाय को '

पता नहीं अगर यह काफी समझ में आता है, लेकिन यह निश्चित रूप से मेरी मदद करता है।


0

उस तरह का मॉडलिंग अजीब है, और अजीब अतार्किक परिणाम पैदा कर सकता है। खासकर अगर शुरुआती ग्रहों की गति वास्तव में धीमी है।

एक जोरदार शक्ति के साथ जहाजों को मॉडल करें।

जब जहाज शुरुआती ग्रह पर अपनी अंतिम कक्षा में होते हैं, तो पूरे जोर के साथ गति करते हैं।

जब जहाज एक निश्चित दूरी के भीतर हो जाता है तो जहाज को लक्ष्य ग्रह की कक्षा की गति को धीमा करने के लिए रिवर्स थ्रस्ट का उपयोग करें।

संपादित करें: एक नोड पर कक्षा छोड़ने के बारे में एक बार में पूरा अनुकरण करें। या तो सभी डेटा भेजें, या अंतराल पर बस कुछ आंदोलन वैक्टर भेजें, और उनके बीच अंतर करें।


समस्या यह है, यह सब टिक आधारित है, कोई मध्यवर्ती स्थिति नहीं है। यह एक नेटवर्किंग मल्टीप्लेयर गेम है और एक पूर्ण गेम में 600+ जहाजों के सभी पदों को भेजना सभी नेटवर्किंग को मार देगा। केवल ऐसी घटनाएं हैं जो एक टिकऑफसेट को प्रसारित करती हैं, बाकी की गणना वर्तमान विश्व टिक और ऑफसेट के आधार पर की जाती है।
इवो ​​वेटजेल

मैंने अपनी प्रतिक्रिया संपादित की।
AttackingHobo

0

अगर मैं इसे सही ढंग से समझूं, तो आपकी समस्या खत्म हो गई है।

मेरा मानना ​​है कि आप चाहते हैं कि स्पेसशिप कुछ समय टी में कक्षाओं के बीच एक निर्दिष्ट पथ के साथ यात्रा करे , और आप यह भी चाहते हैं कि गति एस 1 से गति एस 2 में एक ही समय टी में गति हो । दुर्भाग्य से, आप (सामान्य रूप से) एक त्वरण नहीं पा सकते हैं जो इन दोनों बाधाओं को एक साथ संतुष्ट करता है।

आपको अपनी समस्या को हल करने के लिए थोड़ा आराम करना होगा।


2
फिर इसे कैसे आराम दिया जाए? मैं जो कल्पना कर सकता हूं वह टी को संशोधित करना है जो मैं बीज़ियर पथ सामान में प्लग करता हूं। मुझे इसे किसी तरह से स्केल करने की आवश्यकता है, पहले धीमी और फिर 0.5 तक बढ़ने के लिए। 1. तो यह जहाज मूल गति से घटता है, जो वक्र के मध्य में एक निश्चित गति के लिए है और फिर अंत में इस गति से फिर से गति करता है। वक्र की?
इवो ​​वेटजेल

1
मुझे लगता है कि यदि अंतरिक्ष यान अपनी मूल गति से स्थानांतरण के मध्य बिंदु के आसपास कहीं और फिर नई कक्षा में विघटित हो जाता है तो यह अधिक यथार्थवादी लगेगा।
गारेथ रीस

फिर भी मैं पूरी चीज में त्वरण को कैसे प्लग करना चाहता हूं, मुझे टी को किसी तरह से संशोधित करने की आवश्यकता है: /
इवो ​​वेटजेल

0

मैं इस जवाब में आया क्योंकि मैं एक svg पथ के साथ समान रूप से अंक वितरित करने के लिए देख रहा हूं जो एक बीज़ियर वक्र का उपयोग करता है।

एमडीएन कहने के बावजूद कि यह पदावनत है, आप path.getPointAtLengthसही परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं । https://developer.mozilla.org/en-US/docs/Web/API/SVGPathElement/getPointAtLength

यह वर्तमान में Chrome / Safari / Firefox में काम करता है, और IE / Edge में भी काम करना चाहिए, लेकिन मैंने उन 2 को सत्यापित नहीं किया।


-1

स्वीकृत समाधान के साथ समस्या

बेज़ियर एक घातीय कार्य के रूप में, हम वक्र के विभिन्न क्षेत्रों में अग्रिम की विभिन्न दरों की अपेक्षा करते हैं।

क्योंकि Ivo का समाधान इन प्रारंभिक घातीय नमूनों के बीच रैखिक रूप से प्रक्षेपित होता है , अशुद्धियाँ छोरों के बीच / (आमतौर पर क्यूबिक) वक्र के प्रति भारी पक्षपाती होंगी जहां उन डेल्टा सबसे महान हैं; इसलिए जब तक कि नमूना दर में वृद्धि नहीं की जाती है, जैसा कि वह सुझाव देता है, त्रुटियां स्पष्ट हैं, और ज़ूम के कुछ स्तर पर, किसी दिए गए के लिए हमेशा स्पष्ट होगा , अर्थात पूर्वाग्रह उस एल्गोरिथ्म के लिए आंतरिक है। सदिश-आधारित ग्राफिक्स के लिए अच्छा नहीं है जहाँ ज़ूम असीमित हो सकता है।NN

निर्देशित नमूने के माध्यम से पूर्वाग्रह का मुकाबला करना

बेजियर फ़ंक्शन द्वारा उत्पन्न प्राकृतिक पूर्वाग्रह का मुकाबला distanceकरने के tबाद एक वैकल्पिक समाधान रैखिक रूप से रीमैप के लिए है ।

यह मानते हुए कि हम आदर्श रूप से क्या चाहते हैं:

curve length = 10

t      distance
0.2    2
0.4    4
0.6    6
0.8    8
1.0    10

लेकिन यह वही है जो हमें बेज़ियर स्थिति फ़ंक्शन से मिलता है:

t      distance
0.2    0.12
0.4    1.22
0.6    2.45
0.8    5.81
1.0    10.00

को देख कर Nलिए गए नमूनों, हम जहां दूरी डेल्टा सबसे अधिक होती हैं देख सकते हैं, और resample ( "विभाजन") दो आसन्न दूरी के बीच रास्ते के मध्य में, बढ़ती Nपर 1. द्वारा उदाहरण के लिए, बंटवारे t=0.9(जो सबसे बड़ा डेल्टा में रास्ते के मध्य में है), हम हो सकता है प्राप्त:

0.8    5.81
0.9    7.39
1.0    10.00

हम इस प्रक्रिया को अगले सबसे बड़े अंतर अंतराल के लिए दोहराते हैं, जब तक कि पूरे सेट में किन्हीं दो दूरियों के बीच अधिकतम डेल्टा कुछ से नीचे नहीं है minDistanceDelta, और अधिक विशेष रूप से, epsilonउन विशिष्ट दूरी से कम है, जिनके चरणों में हम जाना चाहते हैं t; इसके बाद हम अपने वांछित tकदमों को रैखिक रूप से मैप कर सकते हैं distance। यह एक हैशटेबल / मैप तैयार करता है, जिसे आप सस्ते में एक्सेस कर सकते हैं और जिनके वैल्यू के बीच में आप रनिंग के दौरान, बिना पक्षपात के ले सकते हैं।

जैसे ही सेट बढ़ता है N, इसे दोहराने की लागत बढ़ जाती है, इसलिए आदर्श रूप से यह एक पूर्व-प्रक्रिया के रूप में होता है। हर बारN बढ़ता है, दो नए परिणामी अंतराल को एक intervalsसंग्रह में जोड़ते हैं, जबकि पुराने एकल अंतराल को हटाते हैं। यह संरचना है जिस पर आप दो में विभाजित करने के लिए अगले सबसे बड़े अंतराल को खोजने के लिए काम करते हैं। intervalsदूरी के अनुसार क्रमबद्ध रखने से चीजें आसान हो जाती हैं, क्योंकि आप अगले काम को अंत में बंद कर सकते हैं, और विभाजन आदि।

हम कुछ वैसा ही समाप्‍त करते हैं जैसे हम आदर्श रूप से चाहते थे:

epsilon: 0.01

t            distance
0.200417     2.00417
0.3998132    3.9998132
0.600703     6.00703
0.800001     8.00001
0.9995309    9.995309

चूँकि हम हर कदम पर अनुमान लगा रहे हैं, हम सटीक दूरी तय नहीं करेंगे 2,4 आदि हम चाहते थे, लेकिन पुनरावृत्ति के माध्यम से ये वांछित दूरी के मूल्यों के काफी करीब पहुँच जाते हैं, इसलिए आप tनिष्पक्षता के साथ अपने कदमों को पूरा कर सकते हैं , पूर्वाग्रह को समाप्त कर सकते हैं। सम-समीपवर्ती नमूने के लिए।

आप इसके बाद पुनः प्राप्त कर सकते हैं t=0.5, जैसे कि इवो अपने उत्तर में करता है, अर्थात ऊपर दिए गए ( 3.9998132और 6.00703) दो निकटतम मानों के बीच प्रक्षेप करके ।

निष्कर्ष

अधिकांश मामलों के लिए, इवो का समाधान अच्छी तरह से काम करेगा, लेकिन उन मामलों के लिए जहां हर कीमत पर पूर्वाग्रह से बचा जाना चाहिए, सुनिश्चित करें कि आपके distanceएस संभव के रूप में समान रूप से बिखरे हुए हैं, और फिर रैखिक रूप से मैप किया गया हैt

ध्यान दें कि प्रत्येक बार बीच में बंटवारे के बजाय विभाजन को स्टोचस्टिक रूप से किया जा सकता है, उदाहरण के लिए, हम उस उदाहरण को विभाजित कर सकते हैं t=0.827बजाय इसके कि पहले t=0.9

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