Я собираюсь предположить, что это изображение является желаемым результатом, то есть g
всегда является линией с отрицательным наклоном, а h
всегда является линией с положительным наклоном: Вот Функция используется для генерации одного из этих многочисленных графиков. Я рекомендую прочитать объяснение ниже, прежде чем посмотреть, как работает код.
function main(ax, g, h)
% ax - handle to an Axes object, i.e. ax = gca;
% g - symbolic function of line with negative slope, i.e. syms g(x); g(x) = 3 - x;
% h - symbolic function of line with positive slope, i.e. syms h(x); h(x) = 1 + x;
X = linspace(-5, 5, 101);
Y = linspace(-5, 5, 101)';
G = double(g(X))-Y; % compute g - y everywhere
H = double(h(X))-Y; % compute h - y everywhere
gi = finverse(g);
hi = finverse(h);
% solve x-intercepts
gx = solve(g);
hx = solve(h);
% solve y-intercepts
gy = solve(gi);
hy = solve(hi);
if sign(gx) == sign(hx)% triangles up/down stacked
% LR: indicates whether we want left/right of Y-axis
% gc: comparison operator (>= or <=) of `g-Y (gc) 0`
% gY: comparison operator (>= or <=) of `Y (gY) 0` for triangle formed by g
% hc: comparison operator (>= or <=) of `h-Y (hc) 0`
% hY: comparison operator (>= or <=) of `Y (hY) 0` for triangle formed by h
if gx >= 0 % triangles in Q1/Q4
LR = X >= 0;
elseif gx < 0 % triangles in Q2/Q3
LR = X <= 0;
end
if gy >= 0 % look below g
gc = @(x) ge(x, 0);
gY = @(x) ge(x, 0);
else % look above g
gc = @(x) le(x, 0);
gY = @(x) le(x, 0);
end
if hy >= 0 % look below h
hc = @(x) ge(x, 0);
hY = @(x) ge(x, 0);
else % look above h
hc = @(x) le(x, 0);
hY = @(x) le(x, 0);
end
gt = gc(G) & gY(Y) & LR;
ht = hc(H) & hY(Y) & LR;
elseif sign(gy) == sign(hy) % triangles left/right side by side
% UD: indicates whether we want up/down of X-axis
% gc: comparison operator (>= or <=) of `g-Y (gc) 0`
% gX: comparison operator (>= or <=) of `X (gX) 0` for triangle formed by g
% hc: comparison operator (>= or <=) of `h-Y (hc) 0`
% hX: comparison operator (>= or <=) of `X (hX) 0` for triangle formed by h
if gy >= 0 % triangles in Q1/Q2
UD = Y >= 0;
elseif gx < 0 % triangles in Q3/Q4
UD = Y <= 0;
end
if gx >= 0 % look left/below of g
gc = @(x) ge(x, 0);
gX = @(x) ge(x, 0);
else % look right/above g
gc = @(x) le(x, 0);
gX = @(x) le(x, 0);
end
if hx >= 0 % look left/above of g
hc = @(x) le(x, 0);
hX = @(x) ge(x, 0);
else % look right/below h
hc = @(x) ge(x, 0);
hX = @(x) le(x, 0);
end
gt = gc(G) & gX(X) & UD;
ht = hc(H) & hX(X) & UD;
else % only 1 triangle
ghx = solve(g == h);
ghy = solve(gi == hi);
if ghy >= 0 % Q1/2
if ghx >= 0 % Q1
gt = G >= 0 & X >= 0 & Y >= 0;
ht = gt;
else % Q2
ht = H >= 0 & X <= 0 & Y >= 0;
gt = ht;
end
else % Q3/4
if ghx >= 0 % Q4
ht = H <= 0 & X >= 0 & Y <= 0;
gt = ht;
else % Q3
gt = G <= 0 & X <= 0 & Y <= 0;
ht = gt;
end
end
end
Z = 0*(X+Y);
Z(gt | ht) = 1;
contourf(ax, X, Y, Z, [1,1]);
plot(ax, [-5, 5], [0, 0], 'k-')
plot(ax, [0,0], [-5, 5], 'k-');
plot(ax, [-5, 5], double(g([-5, 5])), 'b-');
plot(ax, [-5, 5], double(h([-5, 5])), 'r-');
end
Функция может быть вызвана следующим образом:
syms x g(x) h(x)
g(x) = 3 - x;
h(x) = 1 + x;
ax = gca;
hold(ax, 'on')
set(ax, 'XLim', [-5, 5], 'YLim', [-5, 5]);
main(ax, g, h)
Основная идея метода заключается в следующим образом:
- Создайте двумерную сетку нулей на плоскости 2D.
- Если ячейка находится в указанной области, сделайте ее равной 1.
- Тогда построить контур этой сетки.
Недостатком этого метода является то, что полигоны неровные / несовершенные и не гладкие. Это потому, что это численное решение проблемы, а не аналитическое решение.
Часть, которая требовала наибольшего размышления, заключалась в том, как определить площадь для заговора. Как правило, область построения представляет собой либо 1 прямоугольный треугольник (если один из g
и h
проходит начало координат), либо 2 прямоугольных треугольника (во всех остальных случаях, кроме случаев, когда оба g
и h
проходят через происхождение).
В случае 1 прямоугольного треугольника просто найдите пересечение g
и h
, определите его квадрант и определите, является ли гипотенуза прямоугольного треугольника является частью g
или h
.
В случае 2 прямоугольных треугольников, сначала определите, выровнены ли они рядом (если y-перехватчики оба положительные / отрицательный), или один поверх другого (если x-перехваты оба положительные / отрицательные). В каждом случае гипотенуза одного треугольника является частью g
, а гипотенуза другого - частью h
. Мы рассматриваем случай, когда треугольники выровнены бок о бок, так как другой случай аналогичен:
- Если y-пересечение положительное, то ось X является нижней границей каждого треугольника, т.е. мы хотим область, которая удовлетворяет
Y >= 0
. Если x-точка пересечения g
положительна, то мы хотим область ниже g
, так далеко влево, как ось Y, т.е. мы хотим, чтобы точки (x, y) удовлетворяли y <= g
при ограничении x >= 0
, что эквивалентно g-Y >= 0
и X >= 0
.
(Если x-точка пересечения g
отрицательна, то мы хотим, чтобы область выше g
, как можно ближе к оси Y. Это означает g - Y <= 0
и X <= 0
.) Таким образом, треугольник, образованный g
, ограничен условиями Y >= 0
, g-Y >= 0
и X >= 0
.
- . Повторите шаг 2, чтобы получить ограничения для треугольника, образованного
h
. - Последняя желаемая область - это объединение областей, образованных двумя треугольниками.