Άθροισμα διανυσμάτων

Συντονιστής: Τηλέγραφος Κώστας

x_pappas
Δημοσιεύσεις: 5
Εγγραφή: Σάβ Απρ 13, 2019 5:13 pm

Άθροισμα διανυσμάτων

#1

Μη αναγνωσμένη δημοσίευση από x_pappas » Τρί Απρ 30, 2019 6:55 pm

Χριστός Ανέστη,

Έχω να θέσω το εξής πρόβλημα προς επίλυση:

Δίνεται πίνακας ταχυτήτων Α στον οποίο καταχωρούνται ταχύτητες μπαλών (π.χ. ποδοσφαίρου).
Καταχωρούμε για κάθε μπάλα την ταχύτητα και την γωνία ως προς το κατακόρυφο άξονα.

Θέλω να υπολογίσω την συνισταμένη των ταχυτήτων (μέτρο και γωνία).

Ως τώρα παραθέτω τμήμα κώδικα javascript.

Κώδικας: Επιλογή όλων

//variables to check ball connection (Αρχή Διατήρησης της Ορμής)
	var balls_connected;
	var ball_distance;
	var speed_x_total;
	var speed_y_total;
	var speed_total;
	var speed_angle_total;
	var new_speed = [];
	
		new_speed = [];
	for(i=0;i<total_balls;i++){
		new_speed[i]=[];
		//console.log("Ball "+i);
		//console.log("Speed "+balls[i][1]);
		//console.log("Speed angle "+balls[i][2]);
	}
	//console.log("--------------------------");
	for(i=0;i<total_balls;i++){
		//for each ball
		balls_connected = [];
		balls_connected.length = 0;
		for(j=0;j<total_balls;j++){
			if(i!=j){
				ball_distance = Math.sqrt(Math.pow(balls[i][0][balls[i][0].length-1][0]-balls[j][0][balls[j][0].length-1][0],2)+Math.pow(balls[i][0][balls[i][0].length-1][1]-balls[j][0][balls[j][0].length-1][1],2));
				if(ball_distance>2*game_settings.balls_radius){
					balls_connection_found[i][j] = false;
				}else{
					if(balls_connection_found[i][j]==false){
						console.log("Connection found for ball "+i);
						balls_connected.push(j);
						balls_connection_found[i][j] = true;
					}
				}
			}
		}
		
		if(balls_connected.length>0){
			speed_x_total = 0;
			speed_y_total = 0;
			for(j=0;j<balls_connected.length;j++){
				speed_x_total += balls[balls_connected[j]][1]*Math.cos(2*Math.PI*balls[balls_connected[j]][2]/360);
				speed_y_total += balls[balls_connected[j]][1]*Math.sin(2*Math.PI*balls[balls_connected[j]][2]/360);
			}
			speed_total = Math.sqrt(Math.pow(speed_x_total,2)+Math.pow(speed_y_total,2));
			speed_angle_total = 360*(Math.asin(speed_y_total/speed_total))/(2*Math.PI);
			
			new_speed[i][0]=speed_total;
			new_speed[i][1]=speed_angle_total;
			console.log("Ball "+i+" connected with balls:");
			for(j=0;j<balls_connected.length;j++){
				console.log(balls_connected[j]);
			}
			console.log("----------------")
			console.log("Old speed: "+balls[i][1]);
			console.log("Old speed angle: "+balls[i][2]);
			console.log("New speed: "+new_speed[i][0]);
			console.log("New speed angle "+new_speed[i][1]);
			
			//clearInterval(timer_interval);
		}else{
			new_speed[i][0]=balls[i][1];
			new_speed[i][1]=balls[i][2];
		}
		
	}
	
	for(i=0;i<total_balls;i++){
		balls[i][1] = new_speed[i][0];
		balls[i][2] = new_speed[i][1];
	}
Όπως μπορεί κάποιος να παρατηρήσει δεν υπολογίζουμε την συνισταμένη ταχύτητα όλων των μπαλών, αλλά την συνισταμένη ταχύτητα των μπαλών που έχουν κοινά σημεία (η μία "τρέπει" προς την άλλη).

Παράδειγμα έστω ότι έχουμε δύο μπάλες με τα εξής στοιχεία:

Θέση χ πρώτης μπάλας: 50
Θέση y πρώτης μπάλας: 350
Ταχύτητα πρώτης μπάλας (μέτρο): 1 (σε px/msec)
Ταχύτητα πρώτης μπάλας (γωνία) 0 (σε μοίρες)

Θέση χ δεύτερης μπάλας: 250
Θέση y δεύτερης μπάλας: 350
Ταχύτητα δεύτερης μπάλας (μέτρο): 2 (σε px/msec)
Ταχύτητα δεύτερης μπάλας (γωνία) 180 (σε μοίρες)

Όπως φαίνεται οι δύο μπάλες θα κινούνται με αντίθετη ταχύτητα και κάποια στιγμή η μία θα ακουμπήσει την άλλη.
Όταν συμβεί αυτό θέλω να ανταλλάξουν ταχύτητα.

Παραθέτω τα logs της προσωμείωσης:

Κώδικας: Επιλογή όλων

Connection found for ball 0
game.js:204 Ball 0 connected with balls:
game.js:206 1
game.js:208 ----------------
game.js:209 Old speed: 0.561930539128201
game.js:210 Old speed angle: 0
game.js:211 New speed: 1.334431904015155
game.js:212 New speed angle 7.016709298534877e-15
game.js:184 Connection found for ball 1
game.js:204 Ball 1 connected with balls:
game.js:206 0
game.js:208 ----------------
game.js:209 Old speed: 1.334431904015155
game.js:210 Old speed angle: 180
game.js:211 New speed: 0.561930539128201
game.js:212 New speed angle 0
Βλέπουμε ότι η καινούργια γωνία της πρώτης μπάλας είναι

Κώδικας: Επιλογή όλων

game.js:212 New speed angle 7.016709298534877e-15
, δηλαδή περίπου ίση με 0. Το αναμενόμενο είναι να είναι 180.
Το σφάλμα γίνεται (μάλλον) στον υπολογισμό του τόξου ημιτόνου. Εκεί αντί για 180 υπολογίζει 7.016709298534877e-15.

Τι μπορώ να κάνω για να επιλύσω το ζήτημα;

Ευχαριστώ πολύ εκ των προτέρων,
Παππάς Χρήστος
Συνημμένα
select the stars (4).zip
Ανοίγετε το αρχείο select the stars/html/index.html
(26.02 KiB) Μεταφορτώθηκε 15 φορές



Λέξεις Κλειδιά:
x_pappas
Δημοσιεύσεις: 5
Εγγραφή: Σάβ Απρ 13, 2019 5:13 pm

Re: Άθροισμα διανυσμάτων

#2

Μη αναγνωσμένη δημοσίευση από x_pappas » Τετ Μάιος 01, 2019 11:46 pm

Βρήκα μία λύση.

Έχει ως εξής:

Αρχικά εκεί που θέτουμε τις ταχύτητες βάζουμε και πρόσημο ανάλογα με την γωνία.
Για γωνίες μεταξύ του διαστήματος [0,180] βάζουμε θετικό πρόσημο ενώ για γωνίες από (180,360) βάζουμε αρνητικό.

Επίσης ανάλογα με το πρόσημα των συνιστωσών (που υπολογίζονται από το μέτρο της ταχύτητας και την γωνία) έχουμε τις περιπτώσεις:

α) Ux>0 Uy>0 => speed_angle_total = 360*(Math.asin(speed_y_total/speed_total))/(2*Math.PI);
β) Ux<0 Uy>0 => speed_angle_total = 180-(360*(Math.asin(speed_y_total/speed_total))/(2*Math.PI));
γ) Ux<0 Uy<0 => speed_angle_total = 270-(360*(Math.asin(speed_y_total/speed_total))/(2*Math.PI));
δ) Ux>0 Uy<0 => speed_angle_total = 360-(360*(Math.asin(speed_y_total/speed_total))/(2*Math.PI));

Αυτά!!


Απάντηση

Επιστροφή σε “ΜΑΘΗΜΑΤΙΚΑ ΚΑΤΕΥΘΥΝΣΗΣ Β'”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες