namespace {
const double dSafe = 30;
const int rSafe = dSafe / 2;
const double a = -0.3 * dSafe;
int toPixel(double x)
{
return floor(x + 0.5) + 200;
}
}
void TfmMain::drawPoint(double x, double y)
{
int xx = toPixel(x);
int yy = toPixel(y);
Canvas->Ellipse(xx - rSafe, yy - rSafe, xx + rSafe, yy + rSafe);
}
void __fastcall TfmMain::FormPaint(TObject *Sender)
{
Canvas->Brush->Style = bsClear;
Canvas->Pen->Color = clBlack;
double x = 0, y = 0;
drawPoint(x, y);
x += dSafe;
drawPoint(x, y);
for (int i = 0; i < 120; ++i) {
double r = sqrt(x*x + y*y);
double tx = a*x + r*y;
double ty = a*y - r*x;
double tLen = sqrt(tx*tx + ty*ty);
double k = dSafe / tLen;
x += tx * k;
y += ty * k;
drawPoint(x, y);
}
}
Если подвижных мостов мало, можно каждую вершину размножить в 2b экземплярах (b — кол-во мостов). Тогда пойдёт даже не Дейкстра, а обычный поиск в ширину.
Если два моста «сцеплены» друг с другом и наводятся/разводятся одновременно, то в b они идут одной штукой.
А если мостов много и 2b — непозволительная трата, тогда интересно. Думаю, ничего, кроме эвристик, не поможет. Например, может случиться так, что кратчайший путь от включателя до всех мостов, которыми он управляет, посуху. Или мосты (в смысле управляемые) — это мосты (в смысле теории графов). Или что-нибудь ещё.