不同比例的图案线

拉齐扎·奥(Raziza O)

我用在不同画布上创建的图案画线。

我正在翻译和缩放上下文矩阵,并创建另一个模式以实现每一行都将完全从模式的开头开始。(我们知道,模式是从上下文的开头为所有上下文区域重复创建的,并且不依赖于图形)

在大多数情况下,我已经做到了,如下所示。

每行代表一个比例尺。并在不同的Y值上绘制许多线。每条线应沿X轴重复显示红色圆圈。它适用于许多规模。

问题出在规模1.6。第三行线。正如我们所看到的,随着Y值的增长,该行中的线条没有很好地图案化,而且起点也不正确。

我认为这是一些浮点问题。但是我找不到问题。

var ctx = demo.getContext('2d'),
  pattern,
  offset = 0;

/// create main pattern
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(8, 8, 7, 0, Math.PI * 2);
ctx.fill();

runScale(1, 0);
runScale(1.5, 120);
runScale(1.6, 240);
runScale(2, 360);
runScale(3, 480);

function runScale(scale, firstPntX) {


  var newCanvasSize = {
    width: demo.width * scale,
    height: demo.height * scale
  };

  demo2.width = Math.round(newCanvasSize.width);
  demo2.height = Math.round(newCanvasSize.height);

  var firstPnt = {
    x: firstPntX
  };

  var offsetPnt = {
    x: 0,
    y: (newCanvasSize.height / 2)
  };

  var ctx2 = demo2.getContext('2d');
  var pt = ctx2.createPattern(demo, 'repeat');


  ctx = demo3.getContext('2d');

  for (var i = 20; i < 1000; i += (demo2.height + 10)) {
    drawLines(i);
  }

  function drawLines(y) {
    firstPnt.y = y;

    demo2.width = demo2.width;
    ctx2.fillStyle = pt;

    var offsets = [firstPnt.x, y - demo2.height / 2];
    ctx2.translate(offsets[0], offsets[1]);
    ctx2.scale(scale, scale);

    ctx2.fillRect(-offsets[0] / scale, -offsets[1] / scale, demo2.width / scale, demo2.height / scale);

    ctx.lineWidth = newCanvasSize.height;
    pattern = ctx.createPattern(demo2, 'repeat');

    ctx.beginPath();
    ctx.moveTo(firstPnt.x, firstPnt.y);
    ctx.lineTo(firstPnt.x + 100, firstPnt.y);
    ctx.strokeStyle = 'lightgreen';
    ctx.stroke();
    ctx.strokeStyle = pattern;
    ctx.stroke();
  }
}
canvas {
  border: 1px solid #000
}
<canvas id="demo" width=16 height=16></canvas>
<canvas id="demo2"></canvas>
<canvas id="demo3" width=600 height=400></canvas>

拉齐扎·奥(Raziza O)

经过一整天的努力,我终于决定在这里发布这个问题。

现在,一个小时后,我自己找到了解决方案。

我已决定不为了论坛而将其删除。

解决方案是简单地更改偏移量。

更改此行

var offsets = [firstPnt.x, y - demo2.height / 2];

到这条线

var offsets = [firstPnt.x % demo2.width,firstPnt.y % demo2.height - demo2.height / 2];

var ctx = demo.getContext('2d'),
  pattern,
  offset = 0;

/// create main pattern
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(8, 8, 7, 0, Math.PI * 2);
ctx.fill();

runScale(1, 0);
runScale(1.5, 120);
runScale(1.6, 240);
runScale(2, 360);
runScale(3, 480);

function runScale(scale, firstPntX) {


  var newCanvasSize = {
    width: demo.width * scale,
    height: demo.height * scale
  };

  demo2.width = Math.round(newCanvasSize.width);
  demo2.height = Math.round(newCanvasSize.height);

  var firstPnt = {
    x: firstPntX
  };

  var offsetPnt = {
    x: 0,
    y: (newCanvasSize.height / 2)
  };

  var ctx2 = demo2.getContext('2d');
  var pt = ctx2.createPattern(demo, 'repeat');


  ctx = demo3.getContext('2d');

  for (var i = 20; i < 1000; i += (demo2.height + 10)) {
    drawLines(i);
  }

  function drawLines(y) {
    firstPnt.y = y;

    demo2.width = demo2.width;
    ctx2.fillStyle = pt;

    var offsets = [firstPnt.x % demo2.width, firstPnt.y % demo2.height - demo2.height / 2];
    ctx2.translate(offsets[0], offsets[1]);
    ctx2.scale(scale, scale);

    ctx2.fillRect(-offsets[0] / scale, -offsets[1] / scale, demo2.width / scale, demo2.height / scale);

    ctx.lineWidth = newCanvasSize.height;
    pattern = ctx.createPattern(demo2, 'repeat');

    ctx.beginPath();
    ctx.moveTo(firstPnt.x, firstPnt.y);
    ctx.lineTo(firstPnt.x + 100, firstPnt.y);
    ctx.strokeStyle = 'lightgreen';
    ctx.stroke();
    ctx.strokeStyle = pattern;
    ctx.stroke();
  }
}
canvas {
  border: 1px solid #000
}
<canvas id="demo" width=16 height=16></canvas>
<canvas id="demo2"></canvas>
<canvas id="demo3" width=600 height=400></canvas>

感谢您的阅读:D

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不同比例的HOG功能

来自分类Dev

不同比例的 Matplotlib twinx

来自分类Dev

在同一图形上绘制具有不同比例的多条线

来自分类Dev

在不同比例/子图轴上填充两条线之间的区域

来自分类Dev

不同比例的随机分层抽样

来自分类Dev

具有不同比例的多线图

来自分类Dev

格子:在同一面板中绘制两条具有不同比例和轴的线

来自分类Dev

多个Y轴和不同比例的路径

来自分类Dev

具有不同比例的MPandroidchart Double YAxis

来自分类Dev

如何填充图中不同比例的曲线之间的区域?

来自分类Dev

在ggplot2中以不同比例绘制多个图

来自分类Dev

使用Hichcharts绘制不同比例的时间序列

来自分类Dev

缩放具有不同比例因子的单个图像

来自分类Dev

Matplotlib:生成具有不同比例和反向比例的多个双轴

来自分类Dev

Matplotlib:生成具有不同比例和反向比例的多个双轴

来自分类Dev

具有R的GGally ggpair的不同图形的不同比例单位

来自分类Dev

使用 flexbox 为什么两个不同比例的图像拉伸不同

来自分类Dev

pandas DataFrame如何混合不同比例的条形图和折线图

来自分类Dev

获取具有不同比例的2x2 facet_grid

来自分类Dev

如何将不同比例的新图添加到现有直方图中?

来自分类Dev

生成具有交替轴和不同比例的堆叠式多面板图

来自分类Dev

是否可以在一页上绘制具有不同比例的相同变量的多个直方图?

来自分类Dev

如何将两个不同比例的颜色渐变与ggplot合并

来自分类Dev

Highcharts-如何一键导出不同比例的图表

来自分类Dev

如何在altair中添加具有不同比例(与y轴平行)的新轴

来自分类Dev

多面图的不同比例尺:scale_y_continuous()

来自分类Dev

绘制两个具有不同长度的相同比例的系列

来自分类Dev

获取具有不同比例的2x2 facet_grid

来自分类Dev

在y轴上创建具有两种不同比例的图表

Related 相关文章

  1. 1

    不同比例的HOG功能

  2. 2

    不同比例的 Matplotlib twinx

  3. 3

    在同一图形上绘制具有不同比例的多条线

  4. 4

    在不同比例/子图轴上填充两条线之间的区域

  5. 5

    不同比例的随机分层抽样

  6. 6

    具有不同比例的多线图

  7. 7

    格子:在同一面板中绘制两条具有不同比例和轴的线

  8. 8

    多个Y轴和不同比例的路径

  9. 9

    具有不同比例的MPandroidchart Double YAxis

  10. 10

    如何填充图中不同比例的曲线之间的区域?

  11. 11

    在ggplot2中以不同比例绘制多个图

  12. 12

    使用Hichcharts绘制不同比例的时间序列

  13. 13

    缩放具有不同比例因子的单个图像

  14. 14

    Matplotlib:生成具有不同比例和反向比例的多个双轴

  15. 15

    Matplotlib:生成具有不同比例和反向比例的多个双轴

  16. 16

    具有R的GGally ggpair的不同图形的不同比例单位

  17. 17

    使用 flexbox 为什么两个不同比例的图像拉伸不同

  18. 18

    pandas DataFrame如何混合不同比例的条形图和折线图

  19. 19

    获取具有不同比例的2x2 facet_grid

  20. 20

    如何将不同比例的新图添加到现有直方图中?

  21. 21

    生成具有交替轴和不同比例的堆叠式多面板图

  22. 22

    是否可以在一页上绘制具有不同比例的相同变量的多个直方图?

  23. 23

    如何将两个不同比例的颜色渐变与ggplot合并

  24. 24

    Highcharts-如何一键导出不同比例的图表

  25. 25

    如何在altair中添加具有不同比例(与y轴平行)的新轴

  26. 26

    多面图的不同比例尺:scale_y_continuous()

  27. 27

    绘制两个具有不同长度的相同比例的系列

  28. 28

    获取具有不同比例的2x2 facet_grid

  29. 29

    在y轴上创建具有两种不同比例的图表

热门标签

归档