से अधिक है मेरे पास कैनवास पर कुछ मंडलियों को स्थानांतरित करने के लिए एक पुनरावर्ती कार्य है। Overed सर्कल बढ़ाया गया है (ज़ूम इन) और अन्य सभी सर्किलों को धक्का दिया जाता है। धक्का मंडल अन्य सर्किलों को धक्का देते हैं और तब तक ज़ूमिंग पूर्ण होने तक।जावास्क्रिप्ट रिकर्सन: अधिकतम कॉल स्टैक आकार
मैं एक त्रुटि "अधिकतम कॉल स्टैक आकार से अधिक हो" मिलता है, और मैं इस समस्या समझते हैं, लेकिन मैं सिर्फ यह कैसे हल करने के लिए नहीं पता ... मैं सामान्य रूप में प्रत्यावर्तन की समस्याओं को सुलझाने के लिए तीन संभावित समाधान पाया:
- यात्रा करने के लिए
- उपयोग memoization
- उपयोग setTimeout
प्रत्यावर्तन बदलें लेकिन मुझे लगता है कि मैं उनमें से कोई भी उपयोग कर सकते हैं:
- मैं क्योंकि आपरेशन के अज्ञात गिनती की जरूरत की यात्रा लागू नहीं कर सकते
- मैं Memoization काफी अच्छी तरह से समझ में नहीं आता है, लेकिन मुझे लगता है कि यह या तो फिट नहीं करता है (या शायद मैं गलत हूँ और किसी ने मुझसे कहा जा सकता था अलग-अलग?)
- मैं सेटटाइमआउट का उपयोग नहीं कर सकता, क्योंकि यह इस विशेष एनीमेशन पर फ़ंक्शन कॉल को अवरुद्ध करना चाहिए।
मैं इस समस्या को कैसे ठीक करूं?
// Pushes circles aside when some other circle leans on these circles (on zoom in)
var moveCirclesAside = function(circle1, circleToSkip, groupOfMoves) {
var count = circles.length;
for (var i = 0; i < count; i++) {
// Skip the same circle
if (i == circle1.i) {
continue;
}
// Also skip the circle which was intended not to move any further
if (circleToSkip != null && i == circleToSkip.i) {
continue;
}
// Get second circle
var circle2 = circles[i];
// Calculate a distance between two circles
var dx = circle2.x - circle1.x;
var dy = circle2.y - circle1.y;
var distance = Math.sqrt((dx * dx) + (dy * dy));
// If circles already collided need to do some moving...
if (distance <= circle1.r + circle2.r + OD.config.circleSpacing) {
// Get collision angles
var angle = Math.atan2(dy, dx);
var sine = Math.sin(angle);
var cosine = Math.cos(angle);
// Some circle position calculation
var x = OD.config.circleSpacing;
var xb = x + (circle1.r + circle2.r);
var yb = dy * cosine - dx * sine;
// Save each state (move) of any circle to the stack for later rollback of the movement
groupOfMoves.push(copyCircleByVal(circle2));
// Move the circle
circle2.x = circle1.x + (xb * cosine - yb * sine);
circle2.y = circle1.y + (yb * cosine + xb * sine);
// Make sure that circle won't go anywhere out of the canvas
adjustCircleByBoundary(circle2);
// If moved circle leans against some other circles make sure that they are moved accordingly
// And such related moves must be grouped for correct rolback of moves later - so we pass 'groupOfMoves' var
moveCirclesAside(circle2, circle1, groupOfMoves);
}
}
};
आपका उत्तर भी सहायक था, लेकिन दुख की बात है कि मैं केवल एक जवाब स्वीकार कर सकता हूं ... धन्यवाद! – fizis
मैंने इस भावना को व्यक्त करने के लिए इसे आपके ऊपर उठाया है। – agm1984