3线-->三角形--> 3-不等式我要转换
3-Line --> triangle --> 3-inequality I want to convert
如果有任何好的建议,我将不胜感激。
我想从七个地方的三角形部分判断不等号
输入:
x − y = 0, x + y − 2 = 0, 3*x − y − 6 = 0
我要转换波纹管
输出:
x − y >= 0 , x + y − 2 >= 0, 3*x − y − 6 <= 0
一种方法是执行以下步骤:
- 计算三角形的顶点
- 对于每 2 个顶点,计算通过它们的线
- 对于每个顶点,检查其他 2 个顶点的线是在顶点上方还是下方
第 1 步
你可以通过找到每对边的交点来找到三角形的顶点:
让我们找到两条线的交点:ax+by+c=0
和dx+ey+f=0
。
该点应同时满足两个方程,所以:
ax+by=-c
dx+ey=-f
我们可以通过减去第二个方程乘以 (b/e)
来从第一个方程中删除 y。我们得到:
(a-(d*b/e))x=-c+(f*b/e) => x=(-c+f*b/e)/(a-(d*b/e))`
dx+ey=-f
然后我们可以通过减去第一个方程乘以 d 来从第二个方程中删除 x。我们得到:
x=(-c+f*b/e)/(a-(d*b/e))
ey=-f-d(-c+f*b/e)/(a-(d*b/e)) => y=(-f-d(-c+f*b/e)/(a-(d*b/e)))/e
所以交点是:((-c+f*b/e)/(a-(d*b/e)),(-f-d(-c+f*b/e)/(a-(d*b/e)))/e)
丑陋,我知道,但它有效:)
第 2 步
现在我们有了三角形的 3 个顶点,我们称它们为 (x1,y1),(x2,y2),(x3,y3)
。通过 2 个点 (a,b)
和 (c,d)
的直线方程为:
((d-b)/(c-a))x-y-(((d-b)/(c-a))a+b)=0
所以这些行是:
((y2-y1)/(x2-x1))x-y-(((y2-y1)/(x2-x1))x1+y1)=0
((y3-y1)/(x3-x1))x-y-(((y3-y1)/(x3-x1))x1+y1)=0
((y3-y2)/(x3-x2))x-y-(((y3-y2)/(x3-x2))x2+y2)=0
第 3 步
如果 a、b、c 是数字,且 b<0,则当且仅当 ax' + by' + c <= 0
时,点 (x',y')
位于直线 ax+by+c=0
上方。所以只需检查我们之前找到的方程式:三角形的每个顶点都在三角形中,因此直线不等式必须成立,如果一个顶点在边上方,则三角形中的所有其他点都在上方。
希望这个答案对您有用:)
注意:注意极端情况,某些步骤并不适用于所有情况(例如当行为 x=0 时)
当 Line x=not Constant‖(only diagonal Case)
我试试
from sympy import *
var('x y')
def mySympify(myL):
return sympify(myL.replace('=0',''))
def myDicXY(myDic):
return myDic.get(x,""),myDic.get(y,"")
def myStr2Ineq(myStr,myLine,x9,y9):
if myLine.lhs.subs(x,x9).subs(y,y9) < 0 :
ans = myStr.replace('=0', '<=0')
else:
ans = myStr.replace('=0', '>=0')
return ans
myInput="x-y=0,x+y-2=0,3*x-y-6=0"
print("#",myInput)
myStr=myInput.split(',')
myLine_0=Eq(mySympify(myStr[0]),0)
myLine_1=Eq(mySympify(myStr[1]),0)
myLine_2=Eq(mySympify(myStr[2]),0)
x0,y0=myDicXY(solve([myLine_1,myLine_2],[x,y]))
x1,y1=myDicXY(solve([myLine_2,myLine_0],[x,y]))
x2,y2=myDicXY(solve([myLine_0,myLine_1],[x,y]))
myOutput= myStr2Ineq(myStr[0],myLine_0,x0,y0) + "," \
+ myStr2Ineq(myStr[1],myLine_1,x1,y1) + "," \
+ myStr2Ineq(myStr[2],myLine_2,x2,y2)
print("#",myOutput)
# x-y=0,x+y-2=0,3*x-y-6=0
# x-y>=0,x+y-2>=0,3*x-y-6<=0
如果有任何好的建议,我将不胜感激。 我想从七个地方的三角形部分判断不等号
输入: x − y = 0, x + y − 2 = 0, 3*x − y − 6 = 0
我要转换波纹管
输出: x − y >= 0 , x + y − 2 >= 0, 3*x − y − 6 <= 0
一种方法是执行以下步骤:
- 计算三角形的顶点
- 对于每 2 个顶点,计算通过它们的线
- 对于每个顶点,检查其他 2 个顶点的线是在顶点上方还是下方
第 1 步
你可以通过找到每对边的交点来找到三角形的顶点:
让我们找到两条线的交点:ax+by+c=0
和dx+ey+f=0
。
该点应同时满足两个方程,所以:
ax+by=-c
dx+ey=-f
我们可以通过减去第二个方程乘以 (b/e)
来从第一个方程中删除 y。我们得到:
(a-(d*b/e))x=-c+(f*b/e) => x=(-c+f*b/e)/(a-(d*b/e))`
dx+ey=-f
然后我们可以通过减去第一个方程乘以 d 来从第二个方程中删除 x。我们得到:
x=(-c+f*b/e)/(a-(d*b/e))
ey=-f-d(-c+f*b/e)/(a-(d*b/e)) => y=(-f-d(-c+f*b/e)/(a-(d*b/e)))/e
所以交点是:((-c+f*b/e)/(a-(d*b/e)),(-f-d(-c+f*b/e)/(a-(d*b/e)))/e)
丑陋,我知道,但它有效:)
第 2 步
现在我们有了三角形的 3 个顶点,我们称它们为 (x1,y1),(x2,y2),(x3,y3)
。通过 2 个点 (a,b)
和 (c,d)
的直线方程为:
((d-b)/(c-a))x-y-(((d-b)/(c-a))a+b)=0
所以这些行是:
((y2-y1)/(x2-x1))x-y-(((y2-y1)/(x2-x1))x1+y1)=0
((y3-y1)/(x3-x1))x-y-(((y3-y1)/(x3-x1))x1+y1)=0
((y3-y2)/(x3-x2))x-y-(((y3-y2)/(x3-x2))x2+y2)=0
第 3 步
如果 a、b、c 是数字,且 b<0,则当且仅当 ax' + by' + c <= 0
时,点 (x',y')
位于直线 ax+by+c=0
上方。所以只需检查我们之前找到的方程式:三角形的每个顶点都在三角形中,因此直线不等式必须成立,如果一个顶点在边上方,则三角形中的所有其他点都在上方。
希望这个答案对您有用:)
注意:注意极端情况,某些步骤并不适用于所有情况(例如当行为 x=0 时)
当 Line x=not Constant‖(only diagonal Case)
我试试
from sympy import *
var('x y')
def mySympify(myL):
return sympify(myL.replace('=0',''))
def myDicXY(myDic):
return myDic.get(x,""),myDic.get(y,"")
def myStr2Ineq(myStr,myLine,x9,y9):
if myLine.lhs.subs(x,x9).subs(y,y9) < 0 :
ans = myStr.replace('=0', '<=0')
else:
ans = myStr.replace('=0', '>=0')
return ans
myInput="x-y=0,x+y-2=0,3*x-y-6=0"
print("#",myInput)
myStr=myInput.split(',')
myLine_0=Eq(mySympify(myStr[0]),0)
myLine_1=Eq(mySympify(myStr[1]),0)
myLine_2=Eq(mySympify(myStr[2]),0)
x0,y0=myDicXY(solve([myLine_1,myLine_2],[x,y]))
x1,y1=myDicXY(solve([myLine_2,myLine_0],[x,y]))
x2,y2=myDicXY(solve([myLine_0,myLine_1],[x,y]))
myOutput= myStr2Ineq(myStr[0],myLine_0,x0,y0) + "," \
+ myStr2Ineq(myStr[1],myLine_1,x1,y1) + "," \
+ myStr2Ineq(myStr[2],myLine_2,x2,y2)
print("#",myOutput)
# x-y=0,x+y-2=0,3*x-y-6=0
# x-y>=0,x+y-2>=0,3*x-y-6<=0