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; }
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); } }