- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在上面的 Canvas 中画了一个简单的三坐标图;
我定义了一些要使用的常量
var width = window.innerWidth * 0.5 , height = window.innerWidth * 0.5;
var cx = width / 2, cy = height / 2, cz = height / 2, blcx = 0, blcy = height, brcz = height, brcx = width, brcy = height;
var ySegment = height / 30;
var xSegment = width / 30;
var xSegmentRatio = xSegment / width;
var ySegmentRatio = ySegment / height;
cx 和 cy 和 cz 都是指 Canvas 的中心。 blcx
表示 bottom-left-corner-x,brcy
表示 bottom-right-corner-y,等等。我意识到这有点 hack-ish,因为这是第一次尝试这样做,但如果你能忍受我的话,我想在这里掌握一个真正的概念。
然后像这样画红线:
(function() {
var gridCx = cx, gridCy = cy, gridCz = cz;
var gridBlCx = blcx, gridBlCy = brcy;
for (var i = cx; i < width; i++) {
gridCx += xSegment;
gridBlCx += ySegment;
gridCzx -= gridCzx * (xSegmentRatio / ySegmentRatio);
ctx.beginPath();
ctx.moveTo(gridCx, cy);
ctx.lineTo(gridBlCx, height);
ctx.strokeStyle="#FF0000";
ctx.stroke();
}
})();
我试过这个:
gridCzx -= gridCzx * xSegmentRatio;
gridCzy += gridCzy * ySegmentRatio;
ctx.beginPath();
ctx.moveTo(gridCzx, gridCzy);
ctx.lineTo(width, gridCzy);
ctx.strokeStyle = "#ff0000";
ctx.stroke();
得到这个:
但我意识到我遗漏了一些基本的数学概念。感谢您提供的任何见解!我的基本问题是:如何在给定距中心一定距离的情况下选择 z 轴上的点?
最佳答案
轴告诉我们如何移动
要在第一维 x 中找到一个点,请沿 x 轴从左到右移动。要在第二个维度 y 中找到一个点,您必须整合第一个和第二个维度,因此从左到右的第一个 x,一旦有了它,然后沿着屏幕的 y 轴向下找到第二个。
对于每个维度,您都依赖于前一个维度的定位。它还依赖于轴,x 轴和 y 轴彼此成 90 度 Angular ,但它们可能是 45 度或 120 度,这对找到一个点的二维坐标没有任何影响。首先沿着 X 轴,然后沿着 Y 轴。
向量函数
因为显示只是二维的,所以轴可以表示为二维向量。矢量的长度表示轴的比例。因此,对于 x 轴,如果我将轴定义为 2D(显示坐标)向量 (2,0),那么我是说 x 坐标中的每个单位跨度为 2,向下为 0。如果我想在 x 坐标 10 处,我将它乘以轴以获得屏幕位置。
因此代码...
function screenCoord(x,y){ // creates a coordinate in screen space
// screen space is always in pixels
// screen space always has the origin (0,0) at the top left
return {
x : x,
y : y,
}
}
function screenVector(x,y){ // a vector in screen space it points in a direction
// and its is in pixels
return { // basically identical to the last function
x : x,
y : y,
}
}
所以让我们定义我将 (2,0) 放大 2 倍的 X 轴
var xAxis = screenVector(2,0);
现在 x 位置说 10
var xPos = 10
要找到它的位置,我们需要获得沿 x 轴的屏幕坐标。我们通过将 xAxis 乘以 xPos 来实现。为了更容易,我们可以创建一个向量乘法函数
function multiply(vector, value){
var x = vector.x * value; // multiply the vector x by value
var y = vector.y * value; // multiply the vector y by value
return screenCoord(x,y)
}
现在求xPos的第一维pos
var screenPos = multiply(xAxis, xPos); // returns the screen position of x = 10
现在要进行第二个维度,我们将其添加到前一个维度中。让我们定义一个函数来将一个向量添加到另一个向量
function add(vector1, vector2){ // adds two vectors returning a new one
var x = vector1.x + vector2.x;
var y = vector1.y + vector2.y;
return screenCoord(x,y);
}
现在让我们创建 y 轴
var yAxis = new screenVector(0,2); // y goes down the screen and has no x change
和y位置
var posY = 10;
现在让我们从 x 开始
var screenPosX = multiply(xAxis,posX); // get the x position on the screen
var screenPosY = multiply(yAxis,posY); // get the y position on the screen
现在我们把两个坐标的结果相加
var screenXY = add(screenPosX,screenPosY);
我们在屏幕上有一个 x = 10 和 y = 10 的坐标(在这种情况下,它位于像素位置 20,横跨 20 向下。
第三维度
现在不难猜测第 3 个 z 维度会发生什么。对于 x 沿 x 轴,然后 y 沿 y 轴,然后 z 沿 z 轴
所以定义z轴
var yAxis = new screenVector(1,-1); // z axis along the diagonal from bottom left to top right
现在是 z 坐标
var posZ = 10;
所以要找到我们的 3d 位置,x 沿其轴,然后沿其添加 y,然后沿其轴添加 z
var screenPosX = multiply(xAxis,posX); // get the x position on the screen
var screenPosY = multiply(yAxis,posY); // get the y position on the screen
var screenPosZ = multiply(zAxis,posZ); // get the z position on the screen
需要将它们加在一起
var screenXY = add(screenPosX,screenPosY);
然后 z
var screenXYZ = add(screenPosXY,screenPosZ);
然后您将了解如何将一组坐标转换为另一组坐标。它被称为变换
起源
我们缺少最后一点信息。起源。这是坐标 0,0,0 (x,y,z) 在屏幕上的位置。它是转换的最后一部分,在屏幕坐标 (x,y) 中
var origin = screenCoords(100,500); // set the origin at 100 pixels across 500 down
从上次计算我们得到了屏幕空间的screenXYZ坐标,我们需要给它加上原点
screenXYZ = add(screenXYZ ,origin);
现在您可以在 2d 屏幕上从原点在坐标 (10,10,10) (x,y,z) 处绘制像素。
黑客帝国
如果您了解您刚刚学会了如何使用 3D 变换矩阵,希望对您有所帮助。它将 x、y、z 轴作为一组三个 2D 方向,以及原点坐标。矩阵执行完全相同的功能步骤,只是它在一个简单的数组中执行,这使得它更有效,并且遵循一些矩阵规则允许非常复杂的转换。例如,如果你想旋转,你需要做的就是改变轴的方向并且你已经旋转了对象。改变比例只需改变轴的长度,移动物体只需改变原点的位置。
关于javascript - 如何计算 z 轴上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971117/
我在一个C++程序中找到了一段代码,好像每隔for()循环两次。在这个程序中循环,但为什么在这样的预处理器定义中需要第三个 for 呢? #define for for(int z=0;z<2;++z
我正在尝试分割其中有一个小写字母后跟一个大写字母的文本。 假设文本是: “Įvairių rūšiųSkinti kardeliai” 我想在“ųS”处拆分它,但是以下正则表达式“[ą-ž][Ą-Ž]
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 2 年前。 下面的正则表达式有什么区别。对我来说,它们都是一样的 [
我正在尝试用 Java 编写一个正则表达式: "/[A-Z]{6}-[A-Z]{4}-[A-Z]{4}/" 但是它不起作用。例如 "AASAAA-AAAA-AAAA".matches("/[A-Z]{
我需要确定一个字符串是否是一个变量标识符。 即(a-z,A-Z,,$) 后跟 (a-z,A-Z,0-9,,$) 我知道我可以使用手动配置的 reg exp 来完成它,但必须有一个更紧凑的内置函数我可以
早上好,我是新来的,我带来了一个小问题。我无法针对以下问题开发有效的算法:我需要找到三个正数 x、y 和 z 的组合,以便 x + y、x - y、y + z、y - z、x + z 和 x - z
这个问题已经有答案了: How does the ternary operator work? (12 个回答) 已关闭 6 年前。 我发现了一种不同的返回值的方式,并且很兴奋。它到底是什么意思? 如
我需要以下正则表达式,允许 [a-zA-Z]+ 或 [a-zA-Z]+[ \\-]{0,1}[a-zA-Z]+ 所以我想在 a-zA-Z 字符之间允许无限的减号和空格 示例: sdfsdfdsf-sf
我正在编写一个代码,它以“代码”(编码理论)作为输入,并且我已经计算了它的权重枚举器。我想使用 MacWilliams Identity 找到双代码的权重枚举器. 我有W(z) ,代码的权重枚举器,我
我已经编写了一个 child 文字游戏,现在我正在尝试优化性能。游戏以一种特殊的方式从数据库中挑选关键词,我想做得更好。 给定一个按字母数字排序的 MySQL 关键字字段: keyword s
假设一个字符串是abc/xyz/IMPORTANT/DATA/@#!%@!%,我只想要IMPORTANT/DATA/!%#@%!#% 我对正则表达式很烂,而且真的还没学过 JavaScript API
JS代码: ? 1
大家晚上好我想知道有没有更快的方法来生成以下形式的列表? [a,b,c,…,z] → [[z], [y,z], [x,y,z], … , [a,b,…,y,z]] 我知道切片是最好的方法之一,但没有更
我在 Firefox 和其他浏览器上遇到嵌套 z-index 的问题,我有一个 div,z-index 为 30000,位于 label 下方> zindex 为 9000。我认为这是由 z-inde
我正在尝试制作一个灯泡。这是代码 JSfiddle HTML 查询 $('.button').click(function() { $('#add').show();
在您想将嵌套模块导入命名空间的情况下,我总是这样写: from concurrent import futures 不过,我最近意识到这也可以使用“as”语法来表达。请参阅以下内容: import c
我正在尝试创建一个基本上复制 matlab 命令的函数:[z;-z] 其中 z = randn(m,n) 返回一个 m -by-n 随机条目矩阵。我能够在 C++ 中为下面的 randn 函数创建一个
好吧,我迷失在这些指针中,有人能准确地告诉我 char * x,y,z; 和 char* x,y,z 之间的区别是什么; 和 char (*)x,y,z; ?如果可以,请为您的答案或其他内容提供资源。
这是一道函数依赖题。 我知道当 x->yz 然后 x->y 和 x->z 时。但是上面的依赖关系可能吗? 最佳答案 If xy determines z can x determine z and y
我有一个列表列表 nLedgers - 一个 3D 点云: [nodeID, X, Y, Z] 多行。一些节点将具有相同的 X 和 Y 坐标以及不同的 Z 坐标。 我想首先确定具有相同 X 和 Y 坐
我是一名优秀的程序员,十分优秀!