Paperjs:坐标系相关
本文将详细介绍paperjs坐标相关的点
在paperjs的坐标体系中,默认方向为右正下正,没记错的话,应该是同opencv一致。我们通常见到的右正上正的坐标系,是标准的笛卡尔坐标系。这是一点区别。
那么如果现在我们要做一件事情,就是将paperjs的坐标系转换成标准笛卡尔坐标系,该如何实现呢?即使实现,对那些事件点击的操作有什么影响呢
首先我们老样子初始化那一套,然后把标准的缩放拖拽操作随意的加上,同时随意的加上图片、文本等:
图片、文本和矩形框位置信息如下:
showImg(new paper.Point(-200, -200), '@/assets/Sam.webp')
showText(new paper.Point(200, -200), '测试')
showRect(new paper.Point(-200, 200))
从坐标数据结合实际效果看出,这确实是标准的右正下正结构。
在上面的基础之上,我们借助matrix,将坐标系变更为标准的笛卡尔坐标系。
关键代码:
this.project.view.matrix = new paper.Matrix().scale(1, -1)
结果如下:
前后对比,发现了啥?坐标系翻转后,坐标确实变成了标准笛卡尔坐标系,右正上正但是,发现了新的问题:
- project视图的zoom没了,直接导致缩放挂掉
- 图片文字这样的内容,被镜像翻转
zoom为0怎么处理?
查看view发现如下:
确实应用matrix后zoom变成了0,且始终为0。所以,缩放的逻辑就不能再用zoom。那改用谁呢?还是Matrix
export const setProjectZoom = (pro, zoom) => {
const currentZoom = pro.view.matrix.a
const matrix1 = new paper.Matrix().scale(1 / currentZoom, 1 / currentZoom)
const matrix2 = new paper.Matrix().scale(zoom, zoom)
pro.view.transform(matrix1)
pro.view.transform(matrix2)
}
先复位,后赋值期望的zoom
文本图片内容发生了镜像变化,如何处理?
针对文本。
export const modifyDirection = (path: any) => { path.rotate(180) path.scaling = new paper.Point(-1, 1) }针对图片。
图片跟文本一样,完全y方向上倒了过来,处理思路是一致的,所以直接复用原来代码,发现了坑。图片变得巨大
我们加载图片的代码如下:
export const showImg = (point: paper.Point, Img: string) => {
const container = new paper.Path.Rectangle({
position: point,
size: new paper.Size(200, 400)
})
const raster = new paper.Raster({
source: require('@/assets/Sam.webp')
})
raster.onLoad = () => {
raster.fitBounds(container.bounds, false)
// modifyDirectionPic(raster)
}
}
注意上面代码中的fitBounds函数。我们已经让其fitBound了一个容器,所以此时raster的scale就不是默认的1了,那么这时你在modifyDirection中,将其scaling设置为1,可不就得是原来的大小了嘛。那么为了达到我们要的效果,应该设置为几呢?很简单,手动获取一下raster的scaling不就好了?
代码:
// 纠正由于坐标系翻转导致文本的镜像效果
export const modifyDirectionPic = (raster: any) => {
raster.rotate(180)
const newScaling = new paper.Point(-raster.scaling.x, raster.scaling.y)
raster.scaling = newScaling
}
最终效果:
插个坑-设备像素比
在用paperjs开发时,基本操作挂载设置中点。这个过程有个细节:devicePixelRatio.我们需要手动将这个值设置为1,否则就会出问题,这里只介绍为什么。devicePixelRatio决定了我们呢写的像素值,在屏幕上画出来的时候,到底是多大。通常情况下为1,但有些设备比如我的mac,他是2,也就是说,当我想要换一个半径10px的圆,实际要x2…
文over
