Пример #1
0
void MostDistantPoints2d(Point2d* ptList, int ptCount, int* outMin, int* outMax) {
	int minX = 0;
	int maxX = 0;
	int minY = 0;
	int maxY = 0;

	for(int i = 1; i<ptCount; ++i) {
		if (ptList[i].point.x < ptList[minX].point.x) minX = i;
		if (ptList[i].point.x > ptList[maxX].point.x) maxX = i;
		if (ptList[i].point.y < ptList[minY].point.y) minY = i;
		if (ptList[i].point.y > ptList[maxY].point.y) maxY = i;
	}

	Vec2d tempVec1;
	
	Vec2dSub( ptList[maxX].point, ptList[minX].point, &tempVec1 );
	F64 dist2X = Vec2dDot( tempVec1 , tempVec1 );

	Vec2dSub( ptList[maxY].point, ptList[minY].point, &tempVec1 );
	F64 dist2Y = Vec2dDot( tempVec1 , tempVec1 );

	int tempMin = minX;
	int tempMax = maxX;

	if ( dist2Y > dist2X ) {
		tempMax = maxY;
		tempMin = minY;
	}
	
	*outMax = tempMax;
	*outMin = tempMin;
}
Пример #2
0
bool_t Vec2dInitStraight( vec2d_t norm, fp_t *dist, vec2d_t in1, vec2d_t in2 )
{
	vec2d_t		delta;
	fp_t		len;
	bool_t		good;

	Vec2dSub( delta, in2, in1 );
	Vec2dLeft( norm, delta );

	len = norm[0]*norm[0] + norm[1]*norm[1];
	if ( len < ON_EPSILON )
		good = false;
	else
		good = true;

	len = 1.0/sqrt(len);

	norm[0]*=len;
	norm[1]*=len;

	*dist = Vec2dDotProduct( in1, norm );

	return good;
}
void ent_follow_path(entity *self)
{
	Vec2d tile_pos;
	Vec2d tile_center_pos;
	Vec2d self_center_pos = { ENT_CENTER_X(self), ENT_CENTER_Y(self)};
	Vec2d player_center_pos = { ENT_CENTER_X(entity_get_player()), ENT_CENTER_Y(entity_get_player()) };
	Vec2d new_vel;
	//smaller bounds mean closer
	Rect_f tile_bound = {-1,-1, TILE_WIDTH/3, TILE_HEIGHT/3};
	Rect_f self_bound = {self->position.x + self->boundBox.x, self->position.y + self->boundBox.y,
						 self->boundBox.w, self->boundBox.h};
	float x;
	float y;

	int distance;
	if(!self) 
	{
		return;
	}
	if(self->state != STATE_AGGRO)
	{
		return;
	}
	if(!self->path)
	{
	//	slog("No Path");
		return;
		/*Vec2dSub(self_center_pos,player_center_pos,new_vel);
		Normalize2d(new_vel);
		VectorScale(new_vel, new_vel, 10);
		self->velocity = new_vel;
		slog("New Vel X:%f Y:%f", new_vel.x, new_vel.y);
		x = new_vel.x;
		y = new_vel.y;
		while((x * x + y * y) < 25)
		{
			//VectorScale(new_vel, new_vel, 2);
			x *= 2;
			y *= 2;
		}
		new_vel.x = x;
		new_vel.y = y;
		return;*/
	}
	else
	{
		/*slog("Next is: %i", self->path->tile_index);
		slog("Player is %i", tile_get_tile_number(entity_get_player()->position, entity_get_player()->boundBox));*/
		 tile_pos = tile_get_pos(self->path->tile_index);

		 tile_center_pos.x = TILE_CENTER_X(tile_pos);
		 tile_center_pos.y = TILE_CENTER_Y(tile_pos);

		 tile_bound.x = tile_center_pos.x;
		 tile_bound.y = tile_center_pos.y;
	}

/*	if((TILE_CENTER_X(tile_pos) == ENT_CENTER_X(self)) && 
	   TILE_CENTER_Y(tile_pos) == ENT_CENTER_Y(self) )*/
	if(rect_collide(tile_bound, self_bound))
	{
//		slog("rect collide");
		path_free_node(&(self->path));
		self->velocity.x = 0;
		self->velocity.y = 0;
	}
	else
	{	
		Vec2dSub(tile_center_pos, self_center_pos, new_vel);
		Normalize2d(new_vel);
		VectorScale(new_vel, new_vel, 5);
		x = new_vel.x;
		y = new_vel.y;
		while((x * x + y * y) < 49)
		{
			//VectorScale(new_vel, new_vel, 2);
			x *= 2;
			y *= 2;
		}
		new_vel.x = x;
		new_vel.y = y;
		self->velocity = new_vel;
	//	slog("New Vel X:%f Y:%f", new_vel.x, new_vel.y);
	}

}