- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将每个矩形表示为具有宽度和高度的二维矩形。因此,例如,当您在编辑器中创建 map 时,您可以绘制二维矩形,并且该创建可以转换为等距平面。等轴测平面的宽度是从北到东南(从菱形的顶部到右侧。)高度是从北到西南。 (从上到左)
现在我有两个问题。
第一个问题
我正在 Canvas 上绘制这个等距 map ,我使用屏幕外 Canvas 单独绘制每个平面。我想计算屏幕外 Canvas 的二维宽度和高度。我用这个数学来做到这一点:
var canvasWidth = Math.cos(30) * planeWidth + Math.cos(30) * planeHeight;
var canvasHeight = Math.sin(30) * planeWidth + Math.cos(30) * planeHeight;
// still remember that planeWidth and planeHeight are isometric, so oblique sides
但这并没有给我正确的 Canvas 尺寸。我想知道的另一件事是用像素计算斜边是否明智。
第二个问题我想对飞机使用“纹理”图像。所以,我有这样的图像:
我的想法是存储每个图像的斜边,就像平面的宽度和高度一样。当我想用特定图像绘制平面时,我可以重复该图像。
主要目标是创建具有像素精确的给定宽度和高度的等距平面。并且飞机应该有图像作为纹理。图像已经是等轴测的,因此可以像等轴测图 block 一样重复和剪切它们。
我的问题:1. 我想知道使用斜边作为宽度和高度是否明智,无论如何找到一种继续使用二维尺寸的方法不是更好吗?
在屏幕外 Canvas 上创建一个 2d 矩形,并用非等距纹理图像填充它们,然后转换该 Canvas ,这不是更聪明吗?
如果我使用斜边来表示平面和图像的宽度/高度,那么该长度是真实长度吗?它就像一个线性函数:它只是像素。每2个水平,1个垂直。水平方向为奇数,垂直方向不会给出整数。 (我想这会给我以后带来不必要的麻烦)。
最佳答案
要绘制等 Angular 平面,请使用变换矩阵设置 x 轴和 y 轴。
假设x轴沿向量(1,0.5),y轴沿向量(-1,0.5),原点仍位于左上角。
如此定义。
var xAxis = {
x : 1,
y : 0.5,
}
var yAxis = {
x : -1,
y : 0.5,
}
var origin = {
x : 0,
y : 0,
}
要设置转换只需使用
ctx.setTransform(xAxis.x, xAxis.y, yAxis.x, yAxis.y, origin.x, origin.y);
现在所有渲染都在该等轴测平面上。
您可以将轴设置为您想要的等 Angular 投影。我使用的会增加像素的面积。这完全取决于 x 轴和 y 轴的长度和相对方向。
更新
纯粹是出于兴趣。
由于许多等 Angular 投影都有改变每个像素总面积的趋势,因此我包含了一个简单的计算,无论使用哪种投影,都会对像素面积进行标准化。 (对于我给出的投影,它恰好是 2 的平方根的 1)
使用xAxis
和yAxis
计算该投影的像素面积
var area = (xAxis.x * ( xAxis.y + yAxis.y ) + ( xAxis.x + yAxis.x ) * yAxis.y) - (xAxis.y * ( xAxis.x + yAxis.x ) + ( xAxis.y + yAxis.y ) * yAxis.x)
面积平方根除以所需的比例
var scaleBy = 1 / Math.sqrt(area);
您可以将其直接应用于轴,如下所示...
xAxis.x *= scaleBy;
xAxis.y *= scaleBy;
yAxis.x *= scaleBy;
yAxis.y *= scaleBy;
ctx.setTransform(xAxis.x, xAxis.y, yAxis.x, yAxis.y, origin.x, origin.y);
或者在设置变换后通过ctx.scale
应用它
ctx.setTransform(xAxis.x, xAxis.y, yAxis.x, yAxis.y, origin.x, origin.y);
ctx.scale(scaleBy, scaleBy);
示例
该演示展示了此方法的简单应用(没有像素归一化)。
var canvas = document.createElement("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.position = "absolute";
canvas.style.left = "0px";
canvas.style.top = "0px";
document.body.appendChild(canvas);
function demo(){
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var ctx = canvas.getContext("2d");
ctx.font = "80px arial black";
ctx.lineWidth = 8;
ctx.lineJoin = "round"
ctx.strokeStyle = "green";
ctx.fillStyle = "#aF6";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
// the axis and origin
var xAxis = {x : 1, y: 0.5};
var yAxis = {x : -1, y: 0.5};
var origin = {x : 0, y : 0};
// cludge factor dividing by two to fit the display area
ctx.setTransform(xAxis.x / 2, xAxis.y / 2, yAxis.x / 2, yAxis.y / 2, origin.x, origin.y);
// draw big text
ctx.strokeText("Isometric",ctx.canvas.width/2,0);
ctx.fillText("Isometric",ctx.canvas.width/2,0);
// half size text
ctx.font = "40px arial black";
ctx.lineWidth = "4";
ctx.strokeText("projection",ctx.canvas.width/2,60);
ctx.fillText("projection",ctx.canvas.width/2,60);
// tiny text
ctx.font = "16px arial black";
ctx.lineWidth = "3";
ctx.strokeText("using 2D context transformation",ctx.canvas.width/2,100);
ctx.fillText("using 2D context transformation",ctx.canvas.width/2,100);
// add an image to demonstrate that the project will be applied to
// anything that is rendered.
var image = new Image();
image.src = "/image/C7qq2.png?s=328&g=1";
image.addEventListener("load",function(){
ctx.drawImage(this,ctx.canvas.width-this.width,-this.height * 1.2);
});
}
demo();
window.addEventListener("resize",demo);
关于javascript - 如何用图像绘制等 Angular 平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36506073/
我有一个对象: [ { TEAMGROUP: "AB", TEAMNAME: "TEAM1", SPRINTS: [ { ID: 1,
颜色模型和颜色空间之间的差异 RGB565 与 RGB888 有何不同任何建议链接 YUV vs RGB vs YCbCr。? 最佳答案 RGB 是一种加法颜色模型,其中红色、绿色和蓝色强度以不同的组
我正在从单个顶点/索引缓冲区绘制一个具有多个网格的完整对象,并且它们具有不同的纹理。因此,我想到将纹理 ID 与顶点一起从顶点着色器传递到片段着色器中的片段。问题是禁用插值。我正在使用 GLSL ve
我有一个包含 40000 个 float 的数组,用于指定 map 上的高度级别。我想在 OpenGL ES 2.0 中创建一个网格/平面,为该网格中的每个顶点分配一个来自该数组的高度值,以便它们创建
我真的很喜欢 IQ 的页面以及有关 SDF 的信息: ( https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
我创建了 QPushButton在带有此样式表的 Qt Designer 中: QPushButton#pushButton { background-color: #ffffff; } QP
所以我正在寻找一些平面 map 的解决方法,因为它在 IE 上不起作用,我找到了这个:但我不太明白为什么它会起作用 var gadjets = [ {computers:['asus', 'hp'
child Actor 会不会太多?例如,如果我有一个有 10000 个 child Actor 的 Actor ,与每个有 1000 个 child Actor 的 10 个 Actor 相比,这会
我有一个由法线 (n) 和距离 (d)(距原点)定义的平面。我想把它改造成一个新的系统。 长路是这样的: 1) 将距离 (d) 与法线 (n) 相乘得到一个向量 (p) 2) 旋转 (R) 并平移 (
问题: 从球体中减去立方体会得到一个结果,其中 z 轴保留体积,但 y 轴和 x 轴产生平面圆盘,如图所示。我不确定为什么球体在那些方面正在失去体积。我正在使用 threeCSG 的典型减法。 代码:
我通过 SQL 查询从我们的 ERP 获取产品数据,由此返回的数据在大小级别非常平坦。一个产品有 3 个级别: 风格 颜色 尺寸 一种款式有多种颜色,一种颜色有多种尺码。 我创建了以下模型: publ
我正在尝试展开一些 json 数据。如果我像下面这样使用我的测试数据,一切正常! var data = [ { "title": 1, "parentids": [0] }, { "title
我希望使用 SceneKit 在 Swift 中的 3D 空间中绘制多个平面。具体来说,这些表面都将位于双曲面内。我以前从未绘制过自定义形状/对象,而且在尝试理解文档时我已经迷失了方向。 关于在 3D
预先感谢您阅读我的问题。我对 ARKit 非常陌生,并且已经学习了几个教程,这些教程向我展示了如何使用平面检测以及如何为平面使用不同的纹理。这个功能真的很棒,但这是我的问题。玩家是否可以先将飞机放置在
我正在阅读下面的源代码,我想知道我到底为什么要使用平面图方式。正如我所看到的,与通过 if 语句进行简单的 null 检查相比,实例化了更多的对象,执行了更多代码,这将在第一个 null 时终止,而不
我正在编写一个 Rails 应用程序并使用 Flat UI 进行样式设置。我目前正在将 flatui-rails gem 与 twitter-bootstrap-rails gem 结合使用。一切正常
我在维基百科中找到了射线平面相交代码的解决方案,该解决方案有效,我只是在其中求解线性方程组。 后来我找到了一些点到平面投影的代码,显然实现方式不同,并且在特定条件下也会产生不同的解决方案。 但是,我并
我正在使用 http://designmodo.github.io/Flat-UI/ 中的扁平 UI 我复制了复选框示例页面中的所有文件和代码。 但是我注意到该复选框并未显示为样式复选框,但在我单击初
这个问题已经有答案了: True Isometric Projection with HTML5 Canvas (3 个回答) 已关闭 7 年前。 我想创建一个等轴测图。该 map 存在等距矩形,如图
http://designmodo.github.io/Flat-UI/ 我想创建一个 Css 下拉菜单,我已经完成了下拉部分,但是我似乎无法模拟转换,也不知道如何编写这些代码。这是我目前所知道的,在
我是一名优秀的程序员,十分优秀!