1,105,320 Community Members

2D Ball Collision

Member Avatar
tKc
Newbie Poster
23 posts since Oct 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hey y'all, so I've created a 2D billiard program that basically just collides 2 balls together and determines their new direction and velocity however I now want to be able to change the colors of the balls after collision by using

Color.FromArgb(int r, int g, int b)

. I would use something like

Red component = max( velocity * 25, 255 )

... etc for blue and green to create the colours of the balls afterwards (velocity would just be the sum of the square horizontal and vertical velocities). I was wondering if anyone had any tips other than what I have already stated to help me along on this. Thanks (below is code thus far)

using System;
using System.Drawing;
using System.Collections.Generic;

public class Ball: Shape {
	double radius;
	private double mass;

	// constructor for a ball with radius r, centred at position x,y,
	// moving at velocity vx,vy, and with the given colour and mass
	public Ball( double x, double y, double vx, double vy, double radius, double mass )
			: base(x,y,vx,vy) {
		this.radius = radius;
		if (vx == 0.0 && vy == 0.0)
			FillColour = Color.Black;
		this.mass = mass;
	}

	// access the ball's mass
	public double Mass {
		get{ return mass; }
		set{ mass = value; }
	}

	// access the ball's radius
	public double Radius {
		get{ return radius; }
		set{ radius = value; }
	}

	// Moves the ball in the direction of the its vector for the given time duration,
	// bouncing off the sides if there is a collision with any of the 4 sides
	public override void Move( Size rectangleSize, IList<Shape> otherObjects, double duration ) {
		double top   = (double)rectangleSize.Height;
		double right = (double)rectangleSize.Width;

		X += VelocityX * duration;
		if (VelocityX < 0.0 && (X - Radius) < 0.0) { // bounce off left wall
			X = -(X - Radius);
			VelocityX = -VelocityX;
		} else
		if (VelocityX > 0.0 && (X + Radius) > right) { // bounce off right wall
			X = right*2.0 - X - Radius;
			VelocityX = -VelocityX;
		}

		Y += VelocityY * duration;
		if (VelocityY < 0.0 && (Y - Radius) < 0.0) { // bounce off bottom wall
			Y = -(Y - Radius);
			VelocityY = -VelocityY;
		} else
		if (VelocityY > 0.0 && (Y + Radius) > top) { // bounce off top wall
			Y = top*2.0 - Y - Radius;
			VelocityY = -VelocityY;
		}
	}

	// Draw the circle at the current X,Y position
	public override void Draw( Graphics grfx ) {
		grfx.FillEllipse(brush, (float)(X-Radius), (float)(Y-Radius), (float)(Radius*2.0), (float)(Radius*2.0));
	}
	
}
Member Avatar
ddanbe
Posting Expert
5,336 posts since Oct 2008
Reputation Points: 2,054 [?]
Q&As Helped to Solve: 904 [?]
Skill Endorsements: 46 [?]
Featured
 
0
 

Don't forget to do a modulus operation with 255 after you called the max method.
Your color component might end up being greater than 255.

Member Avatar
ddanbe
Posting Expert
5,336 posts since Oct 2008
Reputation Points: 2,054 [?]
Q&As Helped to Solve: 904 [?]
Skill Endorsements: 46 [?]
Featured
 
0
 

Perhaps this code could be of interest.

Member Avatar
tKc
Newbie Poster
23 posts since Oct 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hokay so I got something that kinda works until it crashes. It goes until the balls first impacts then "Value was either too large or too small for an Int32", must be when I try converting it to an integer however the error message pops up but the program kinda works in the background with a lot of lag time and the balls do change colour.

public void Speed(double VelocityX, double VelocityY){
		double x;
		VelX = VelocityX*VelocityY;
		VelY = VelocityY*VelocityY;
		Vel = VelX + VelY;
		x = Math.Sqrt(Vel);
		speed = Convert.ToInt32(x);
		Console.WriteLine(speed);
		
	}	
	

public Color ChangeColour{
		
		get {
			return Color.FromArgb(max( speed * 25, 255 ) , max( speed * 20, 255 ), min( 255 - 20*speed, 0));
		}

		
	}
	
	public int max(int velocity, int maximum){
		if (velocity<maximum){return velocity;}
		else 
			return maximum;
		
	}
	
	public int min(int velocity, int minimum){
		if(velocity>minimum){return velocity;}
		else
			return minimum;
	}
You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
View similar articles that have also been tagged: