本文整理汇总了C++中Point::Length方法的典型用法代码示例。如果您正苦于以下问题:C++ Point::Length方法的具体用法?C++ Point::Length怎么用?C++ Point::Length使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Point
的用法示例。
在下文中一共展示了Point::Length方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
// Fire an anti-missile. Returns true if the missile should be killed.
bool Armament::Weapon::FireAntiMissile(Ship &ship, const Projectile &projectile, list<Effect> &effects)
{
int strength = outfit->AntiMissile();
if(!strength)
return false;
double range = outfit->Velocity();
// Check if the missile is in range.
Point start = ship.Position() + ship.Facing().Rotate(point);
Point offset = projectile.Position() - start;
if(offset.Length() > range)
return false;
// Figure out where the effect should be placed. Anti-missiles do not create
// projectiles; they just create a blast animation.
start += (.5 * range) * offset.Unit();
Angle aim = TO_DEG * atan2(offset.X(), -offset.Y());
for(const auto &eit : outfit->HitEffects())
for(int i = 0; i < eit.second; ++i)
{
effects.push_back(*eit.first);
effects.back().Place(start, ship.Velocity(), aim);
}
Fire(ship);
return (Random::Int(strength) > Random::Int(projectile.MissileStrength()));
}
示例2: CircleAround
void AI::CircleAround(Ship &ship, Command &command, const Ship &target)
{
// This is not the behavior I want, but it's reasonable.
Point direction = target.Position() - ship.Position();
command.SetTurn(TurnToward(ship, direction));
if(ship.Facing().Unit().Dot(direction) >= 0. && direction.Length() > 200.)
command |= Command::FORWARD;
}
示例3: Contains
// Check whether the mask contains the given point.
bool Mask::Contains(Point point, Angle facing) const
{
if(outline.empty() || point.Length() > radius)
return false;
// Rotate into the mask's frame of reference.
return Contains((-facing).Rotate(point));
}
示例4:
void
Invert::Transform (real &w, Point& p)
{
const Point diff = p-C_ptr->Center();
real r=diff.Length();
real ratio=RadiusSq/(r*r);
p = C_ptr->Center()+diff*ratio;
w *= ratio*ratio;
}
示例5: C
void
E2toIS::Transform(real& w, Point& p)
{
InfiniteStrip& s = *IS_ptr;
Point D = s.B()- s.A();
Point C(-D.Y(),D.X());
C = C/C.Length();
w *= D.Length()*.5*(1-tanh(p.X())*tanh(p.X()));
p = s.A() + p.Y()*C + (.5*(1+tanh(p.X())))*D;
}
示例6: InBlastRadius
// Check if the given ship is within this projectile's blast radius. (The
// projectile will not explode unless it is also within the trigger radius.)
bool Projectile::InBlastRadius(const Ship &ship, int step, double closestHit) const
{
// "Invisible" ships can be killed by weapons with blast radii.
Point offset = position + closestHit * velocity - ship.Position();
if(offset.Length() <= weapon->BlastRadius())
return true;
const Mask &mask = ship.GetMask(step);
return mask.WithinRange(offset, ship.Facing(), weapon->BlastRadius());
}
示例7: Attack
void AI::Attack(Ship &ship, Command &command, const Ship &target)
{
Point d = target.Position() - ship.Position();
// First, figure out what your shortest-range weapon is.
double shortestRange = 4000.;
for(const Armament::Weapon &weapon : ship.Weapons())
{
const Outfit *outfit = weapon.GetOutfit();
if(outfit && !weapon.IsAntiMissile())
shortestRange = min(outfit->Range(), shortestRange);
}
// Deploy any fighters you are carrying.
if(!ship.IsYours())
command |= Command::DEPLOY;
// If this ship only has long-range weapons, it should keep its distance
// instead of trying to close with the target ship.
if(shortestRange > 1000. && d.Length() < .5 * shortestRange)
{
command.SetTurn(TurnToward(ship, -d));
if(ship.Facing().Unit().Dot(d) <= 0.)
command |= Command::FORWARD;
return;
}
// First of all, aim in the direction that will hit this target.
command.SetTurn(TurnToward(ship, TargetAim(ship)));
// Calculate this ship's "turning radius; that is, the smallest circle it
// can make while at full speed.
double stepsInFullTurn = 360. / ship.TurnRate();
double circumference = stepsInFullTurn * ship.Velocity().Length();
double diameter = max(200., circumference / PI);
// This isn't perfect, but it works well enough.
if((ship.Facing().Unit().Dot(d) >= 0. && d.Length() > diameter)
|| (ship.Velocity().Dot(d) < 0. && ship.Facing().Unit().Dot(d.Unit()) >= .9))
command |= Command::FORWARD;
}
示例8: TakeDamage
// This ship just got hit by the given projectile. Take damage according to
// what sort of weapon the projectile it.
int Ship::TakeDamage(const Projectile &projectile, bool isBlast)
{
int type = 0;
const Outfit &weapon = projectile.GetWeapon();
double shieldDamage = weapon.ShieldDamage();
double hullDamage = weapon.HullDamage();
double hitForce = weapon.HitForce();
double heatDamage = weapon.HeatDamage();
double ionDamage = weapon.IonDamage();
bool wasDisabled = IsDisabled();
bool wasDestroyed = IsDestroyed();
if(shields > shieldDamage)
{
shields -= shieldDamage;
heat += .5 * heatDamage;
ionization += .5 * ionDamage;
}
else if(!shields || shieldDamage)
{
if(shieldDamage)
{
hullDamage *= (1. - (shields / shieldDamage));
shields = 0.;
}
hull -= hullDamage;
heat += heatDamage;
ionization += ionDamage;
}
if(hitForce && !IsHyperspacing())
{
Point d = position - projectile.Position();
double distance = d.Length();
if(distance)
ApplyForce((hitForce / distance) * d);
}
if(!wasDisabled && IsDisabled())
type |= ShipEvent::DISABLE;
if(!wasDestroyed && IsDestroyed())
type |= ShipEvent::DESTROY;
// If this ship was hit directly and did not consider itself an enemy of the
// ship that hit it, it is now "provoked" against that government.
if(!isBlast && projectile.GetGovernment() && !projectile.GetGovernment()->IsEnemy(government)
&& (Shields() < .9 || Hull() < .9 || !personality.IsForbearing())
&& !personality.IsPacifist())
type |= ShipEvent::PROVOKE;
return type;
}
示例9: CanLand
// Check if this ship is currently able to begin landing on its target.
bool Ship::CanLand() const
{
if(!GetTargetPlanet() || !GetTargetPlanet()->GetPlanet() || isDisabled || IsDestroyed())
return false;
if(!GetTargetPlanet()->GetPlanet()->CanLand(*this))
return false;
Point distance = GetTargetPlanet()->Position() - position;
double speed = velocity.Length();
return (speed < 1. && distance.Length() < GetTargetPlanet()->Radius());
}
示例10: Collide
// Check if this mask intersects the given line segment (from sA to vA). If
// it does, return the fraction of the way along the segment where the
// intersection occurs. The sA should be relative to this object's center.
// If this object contains the given point, the return value is 0. If there
// is no collision, the return value is 1.
double Mask::Collide(Point sA, Point vA, Angle facing) const
{
// Bail out if we're too far away to possibly be touching.
double distance = sA.Length();
if(outline.empty() || distance > radius + vA.Length())
return 1.;
// Rotate into the mask's frame of reference.
sA = (-facing).Rotate(sA);
vA = (-facing).Rotate(vA);
// If this point is contained within the mask, a ray drawn out from it will
// intersect the mask an even number of times. If that ray coincides with an
// edge, ignore that edge, and count all segments as closed at the start and
// open at the end to avoid double-counting.
// For simplicity, use a ray pointing straight downwards. A segment then
// intersects only if its x coordinates span the point's coordinates.
if(distance <= radius && Contains(sA))
return 0.;
return Intersection(sA, vA);
}
示例11: TurnToward
double AI::TurnToward(const Ship &ship, const Point &vector)
{
static const double RAD_TO_DEG = 180. / 3.14159265358979;
Point facing = ship.Facing().Unit();
double cross = vector.Cross(facing);
if(vector.Dot(facing) > 0.)
{
double angle = asin(cross / vector.Length()) * RAD_TO_DEG;
if(fabs(angle) <= ship.TurnRate())
return -angle / ship.TurnRate();
}
bool left = cross < 0.;
return left - !left;
}
示例12: WithinRange
// Find out how close this mask is to the given point. Again, the mask is
// assumed to be rotated and scaled according to the given unit vector.
bool Mask::WithinRange(Point point, Angle facing, double range) const
{
// Bail out if the object is too far away to possible be touched.
if(outline.empty() || range < point.Length() - radius)
return false;
// Rotate into the mask's frame of reference.
point = (-facing).Rotate(point);
// For efficiency, compare to range^2 instead of range.
range *= range;
for(const Point &p : outline)
if(p.DistanceSquared(point) < range)
return true;
return false;
}
示例13: Draw
// Draw the radar display at the given coordinates.
void Radar::Draw(const Point ¢er, double scale, double radius, double pointerRadius) const
{
RingShader::Bind();
for(const Object &object : objects)
{
Point position = object.position * scale;
double length = position.Length();
if(length > radius)
position *= radius / length;
position += center;
RingShader::Add(position, object.outer, object.inner, object.color);
}
RingShader::Unbind();
PointerShader::Bind();
for(const Pointer &pointer : pointers)
PointerShader::Add(center, pointer.unit, 10., 10., pointerRadius, pointer.color);
PointerShader::Unbind();
}
示例14: MoveTo
bool AI::MoveTo(Ship &ship, Command &command, const Point &target, double radius, double slow)
{
const Point &position = ship.Position();
const Point &velocity = ship.Velocity();
const Angle &angle = ship.Facing();
Point distance = target - position;
double speed = velocity.Length();
bool isClose = (distance.Length() < radius);
if(isClose && speed < slow)
return true;
distance = target - StoppingPoint(ship);
bool isFacing = (distance.Unit().Dot(angle.Unit()) > .8);
if(!isClose || !isFacing)
command.SetTurn(TurnToward(ship, distance));
if(isFacing)
command |= Command::FORWARD;
return false;
}
示例15: Draw
void OutlineShader::Draw(const Sprite *sprite, const Point &pos, const Point &size, const Color &color, const Point &unit, float frame)
{
glUseProgram(shader.Object());
glBindVertexArray(vao);
GLfloat scale[2] = {2.f / Screen::Width(), -2.f / Screen::Height()};
glUniform2fv(scaleI, 1, scale);
GLfloat off[2] = {
static_cast<float>(.5 / size.X()),
static_cast<float>(.5 / size.Y())};
glUniform2fv(offI, 1, off);
glUniform1f(frameI, frame);
glUniform1f(frameCountI, sprite->Frames());
Point uw = unit * size.X();
Point uh = unit * size.Y();
GLfloat transform[4] = {
static_cast<float>(-uw.Y()),
static_cast<float>(uw.X()),
static_cast<float>(-uh.X()),
static_cast<float>(-uh.Y())
};
glUniformMatrix2fv(transformI, 1, false, transform);
GLfloat position[2] = {
static_cast<float>(pos.X()), static_cast<float>(pos.Y())};
glUniform2fv(positionI, 1, position);
glUniform4fv(colorI, 1, color.Get());
glBindTexture(GL_TEXTURE_2D_ARRAY, sprite->Texture(unit.Length() * Screen::Zoom() > 50.));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
glUseProgram(0);
}