public void calcPoints() { points = new Vector[rads.Length]; for (int i = 0; i < rads.Length; ++i) { points[i] = Vector.fromRadMag(rads[i], Abs(dists[i])); } }
/// <summary> /// Scan one wall. /// </summary> private ScanResult _ScanWall(Wall wall, double[] rads) { ScanResult res = ScanResult.init(rads, range + 1); var egopos = ego.pos; var castTry = new CircleCast(egopos, 0, margin); var hitTry = castTry.CastTo(wall); // currently in collision if (hitTry.isOriginHit) { res.isCollision = true; var dist2wall = wall.DistToPoint_TruncatedByEnds(egopos); var colSeverity = Max(0, margin + wall.margin - dist2wall) / margin; for (int i = 0; i < rads.Length; ++i) { var rad = rads[i]; var repulsionDir = wall.RepulsionDirToPoint(egopos); if (useSafety) { res.safety[i] = Cos(AbsRad(rads[i] - repulsionDir.rad)) * (1 + colSeverity); } else { var dist = Max(0.1, Vector.fromRadMag(rad, 1) * repulsionDir * 100); res.dists[i] = dist; } } } // not in collision else { for (int i = 0; i < rads.Length; ++i) { var rad = rads[i]; var cast = new CircleCast(egopos, rad, margin); var hit = cast.CastTo(wall); // No hit if (!hit.isHit) { continue; } // Hit var dist = hit.dist; if (dist < res.dists[i]) { res.dists[i] = dist; } } } return(res); }
protected void UpdateProperty() { rad = Deg2Rad(deg); dir = Vector.fromRadMag(rad, 1); pos = new Vector(x, y); }