void Map::CalcBetaSkeletonHeightmap(float gamma, Heightmap &map) { int size = towns.size(); bool hasATownInBetaSkeleton = false; const float step_y = 0.1f; int cmp = 0; for (int a = 0; a < size; ++a) { for (int b = cmp; b < size; ++b) { if (a == b) continue; bool hasATownInBetaSkeleton = false; for (int p = 0; p < size; ++p) { if (p != a && p != b && IsInBetaSkeletonHeightmap(towns[p], towns[a], towns[b], gamma, map)) { hasATownInBetaSkeleton = true; } } if (!hasATownInBetaSkeleton) { waysPoints.push_back(towns[a]); waysPoints.push_back(towns[b]); waysCost.push_back(map.getDistance(towns[a], towns[b])); waysEdges.push_back(Vector2d(waysPoints.size() - 2, waysPoints.size() - 1)); } } ++cmp; } }
bool Map::IsInMoonBetaSkeletonHeightmap(const Vector2d & p, const Vector2d & a, const Vector2d & b, float gamma, Heightmap &map) { float distAP = map.getDistance(a, p); float distBP = map.getDistance(b, p); float distAB = map.getDistance(a, b); return std::abs(std::pow(distAP, gamma) + std::pow(distBP, gamma) - std::pow(distAB, gamma)) < 1.f; }