Перпендикуляры к v = (X, Y) — v1 = (-Y, X) и v2 = -v1 = (Y, -X).
Код: Выделить всё
procedure Capsule(c: TCanvas; x1, y1, x2, y2, r: integer);
var
k: single;
ndx, ndy: integer;
begin
c.Ellipse(x1-r, y1-r, x1+r+1, y1+r+1);
c.Ellipse(x2-r, y2-r, x2+r+1, y2+r+1);
k := sqrt(sqr(x2 - x1) + sqr(y2 - y1));
if k > 0 then k := r/k;
ndx := round(k * (y2 - y1));
ndy := round(k * -(x2 - x1));
c.Line(x1 + ndx, y1 + ndy, x2 + ndx, y2 + ndy);
c.Line(x1 - ndx, y1 - ndy, x2 - ndx, y2 - ndy);
end;
Модификацией с Arc убираются внутренние части окружностей (хотя вряд ли тебе это нужно хд):
Код: Выделить всё
uses Math;
procedure Capsule(c: TCanvas; x1, y1, x2, y2, r: integer);
var
k: single;
ndx, ndy, fixx, fixy: integer;
begin
k := sqrt(sqr(x2 - x1) + sqr(y2 - y1));
if k > 0 then k := r/k;
ndx := round(k * (y2 - y1));
ndy := round(k * -(x2 - x1));
fixx := sign(x2 - x1);
fixy := sign(y2 - y1);
c.Arc(x1-r, y1-r, x1+r+1, y1+r+1, x1 + ndx + fixx, y1 + ndy + fixy, x1 - ndx + fixx, y1 - ndy + fixy);
c.Arc(x2-r, y2-r, x2+r+1, y2+r+1, x2 - ndx - fixx, y2 - ndy - fixy, x2 + ndx - fixx, y2 + ndy - fixy);
c.Line(x1 + ndx, y1 + ndy, x2 + ndx, y2 + ndy);
c.Line(x1 - ndx, y1 - ndy, x2 - ndx, y2 - ndy);
end;

- capsule.png (5.68 КБ) 13057 просмотров
А вот убрать вообще все внутренности будет сложнее...