可能有错。
1.判断点在线段上
×乘。先判断特殊情况 水平和垂直,再判断它是否共线。
local p = cc.p( 40, 71)
local lineA = cc.p(20,50)
local lineB = cc.p(40, 70)
local pa = cc.pSub(p,lineA)
local ab = cc.pSub(lineB,lineA)
local dir1 = false
if (p.x >= lineA.x and p.x <=lineB.x) and (p.y >= lineA.y and p.y <= lineB.y) then
dir1 = true
end
print("dir1",dir1)
if cc.pCross(pa,ab) == 0 and dir1 then
print("在。")
end
2.不规则物体反弹
local rect1 = line:getBoundingBox()
local rect2 = cicleSprite:getBoundingBox()
local cy = math.tan(deg) * 532.87 + 532.87
print("当前坐标为",cy)
rect1.y = cy +cicleSprite:getContentSize().height / 2
local isco = cc.rectIntersectsRect(rect1,rect2)
if isco then
if self.cc == nil then
self.cc = cc.Sprite:create("res/Player.png")
self:addChild(self.cc)
print("坐标Y为",rect2.x)
self.cc:setPosition(rect2.x,cy)
end
local zs = cc.pSub(cc.p(0,480),cc.p(display.cx+500,480))
local cx = cc.p(zs.y,-zs.x)
guiyihua_ = cc.pNormalize(cc.p(cx.x ,cx.y))--单位向量n
-- 求投影向量N。N = (-s.n)n
m_x = - (vec_s.x * guiyihua_.x + vec_s.y * guiyihua_.y) * guiyihua_.x
m_y = - (vec_s.x * guiyihua_.x + vec_s.y * guiyihua_.y) * guiyihua_.y
-- 画图可知 由公式 向量: s + m = t ,m + t = f--->>f = 2t - s
m2 = cc.pAdd(cc.p(vec_s.x,vec_s.y),cc.p(m_x,m_y))
fx = - vec_s.x + 2 * m2.x
fy = - vec_s.y + 2 * m2.y
print("fx",fx)
vec_s.x = fx
vec_s.y = fy
cicleSprite:setPosition(cicleSprite:getPositionX() + vec_s.x * dt * 2 ,cicleSprite:getPositionY() + vec_s.y * dt * 2)