下面的代码将蓝色矢量AC投影到红色矢量AB上,得到的投影矢量AD被绘制为紫色.这是我自己实现的Wolfram演示.
然而有些事情是错的,我可以真正弄清楚是什么.应该是投影公式本身是错误的,或者我错误地将一些局部坐标与世界坐标错误.任何帮助表示赞赏.
假设你有pygame,这个代码被修剪但仍然可以没有问题地执行:
import pygame
from pygame.locals import *
def vadd(a,b):
return (a[0]+b[0],a[1]+b[1])
def vsub(a,b):
return (a[0]-b[0],a[1]-b[1])
def project(a, b):
""" project a onto b
formula: b(dot(a,b)/(|b|^2))
"""
abdot = (a[0]*b[0])+(a[1]*b[1])
blensq = (b[0]*b[0])+(b[1]*b[1])
temp = float(abdot)/float(blensq)
c = (b[0]*temp,b[1]*temp)
print a,b,abdot,blensq,temp,c
return c
pygame.init()
screen = pygame.display.set_mode((150, 150))
running = True
A = (75.0,75.0)
B = (100.0,50.0)
C = (90,70)
AB = vsub(B,A)
AC = vsub(C,A)
D = project(AC,AB)
AD = vsub(D,A)
while running:
for event in …Run Code Online (Sandbox Code Playgroud) 是否可以使用投影查询返回实体?
我已成功完成了SQL查询(见下文),但无法找到如何使用投影查询.
Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk")
' Convert SQL results into entities {a} and {b}
Dim query As IQuery = session.CreateSQLQuery(sql) _
.AddEntity("a", GetType(a)) _
.AddEntity("b", GetType(b))
Return query.List()
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个小的"automapper-esq"实用程序,它将采用LinqToSql实体并将其映射到"投影类".
到目前为止,我有这样的事情:
class Entity
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public string UnWantedPropertyData { get; set; }
...More Unwanted Properties...
public IEnumerable<ChildEntity> ChildEntities { get; set; }
}
class EntityProjection
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public IEnumerable<ChildEntityProjection> ChildEntities { get; set; }
}
class ChildEntityProjection
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 我的 NetCDF 文件有 4 个维度(经度、纬度、时间、水平压力)和几个变量。
我想用 [-20 -18 -16 ... -2 0 2 4 ... 18 20] 替换 [340 342 344 ... 360 0 2 4 ... 18 20] 的经度数据。事实上,经度是从 0° 到 360° 计算的,但我需要从 -180° 到 180°。
我在互联网上找到了一些想法,但我不知道如何应用它们。
这里有一个解释:
“一些 netcdf 文件包含严格的正值 [0,360],这与 gdal/QGis 处理经度值的方式不兼容 - 它们不会环绕日期变更线。这也会导致 gdalwarp 以及与其他数据集([-180,180 ] 值),由于 180 度经度偏移,它们没有正确对齐。
简单的解决方法是测试经度变量并将 [180,360] 间隔中的任何值通过减去 180 转换为 [-180,180] - 在 IReadBlock 和 SRS 检测中。”
我也读过“gdal-translate”,但我不知道如何使用它。
编辑:我的纬度也有问题,它是 N -> S(我想要它 S -> N),由于“cdo invertlat”,我将其反转
我正在尝试在我的祖国奥地利的 SVG 地图上投影一组点([long, lat] 元组):
https://commons.wikimedia.org/wiki/File:Austria-geographic_map-blank.svg
维基媒体上对 SVG 文件的描述给出了投影名称和地图边界:
Lambert Conformal Conic,WGS84 数据
地图的地理范围:西:17.2° W
东:9.3° W
北:49.2° N
南:46.0° N
虽然我很天真,但我认为这些信息足以用 D3 创建正确的投影。
这是我首先尝试的:
let gcc = d3.geoConicConformal()
.fitSize([width, height], bbox)
Run Code Online (Sandbox Code Playgroud)
哪里bbox是表示上面给出的地图边界的 GeoJSON 多边形。
不幸的是,结果不是正确的预测:
现在,通过阅读 D3 文档,我可以猜测我必须为投影指定更多参数,例如两个标准平行线。不幸的是,我不知道它们是什么,并且在地图的西部和东部边界周围尝试各种值都没有奏效。我认为它们可以从我对地图的了解中推导出来,或者可能不是?
其次,让我感到困惑的是,投影不仅旋转错误,而且缩放也不正确——我认为使用.fitSize会解决这个问题。
任何人都可以给我任何关于正确设置兰伯特圆锥共形投影的指示吗?
我想让一个 DOM 节点在我的 THREE.js 模拟中跟踪一个粒子。我的模拟是使用 Points 对象构建的,使用 bufferGeometry。我正在设置渲染循环中每个顶点的位置。在模拟过程中,我移动/旋转相机和 Points 对象(通过其父 Object3d)。
我不知道如何为我的任何粒子获得可靠的屏幕坐标。我已经按照其他问题的说明进行操作,例如Three.JS: Get position of rotation object,以及使用 Projection 在 Three.js 中将世界坐标转换为屏幕坐标,但它们似乎都不适合我。在这一点上,我可以看到顶点的计算投影随着我的相机移动和对象旋转而变化,但不是我可以实际映射到屏幕的方式。此外,有时在屏幕上相邻的两个粒子会产生截然不同的投影位置。
这是我最近的尝试:
const { x, y, z } = layout.getNodePosition(nodes[nodeHoverTarget].id)
var m = camera.matrixWorldInverse.clone()
var mw = points.matrixWorld.clone()
var p = camera.projectionMatrix.clone()
var modelViewMatrix = m.multiply(mw)
var position = new THREE.Vector3(x, y, z)
var projectedPosition = position.applyMatrix4(p.multiply(modelViewMatrix))
console.log(projectedPosition)
Run Code Online (Sandbox Code Playgroud)
基本上我已经复制了着色器中的操作来派生gl_Position.
projectedPosition 是我想存储屏幕坐标的地方。
如果我错过了一些明显的东西,我很抱歉......我已经尝试了很多东西,但到目前为止没有任何效果:/
在此先感谢您的帮助。
我需要将x0到1之间的值()投影到aw shape(y=f(x)):
我可以通过以下功能实现我所需要的:
f <- function(x) {
if (x < 0.25) {
return (1-4*x)
}
if (x < 0.50) {
return (-1 + 4*x)
}
if (x < 0.75) {
return (3 - 4*x)
}
return (-3 + 4*x)
}
x <- 0:20/20
y <- lapply(x, f)
plot(x, y)
lines(x,y, col='red')
Run Code Online (Sandbox Code Playgroud)
但是,我倾向于相信我的问题有一个更优雅的解决方案,可能是一个班轮.
R中有这样的东西吗?
我有一个场景,我想将透视对象(即远离时看起来较小的对象)与正交对象(即,无论距离如何都显示相同大小的对象)结合起来。透视对象是渲染“世界”的一部分,而正交对象是装饰品,如标签或图标。与 HUD 不同的是,我希望正交对象在世界“内部”渲染,这意味着它们可以被世界对象覆盖(想象一下在标签之前经过的平面)。
我的解决办法是使用一个渲染器,但两个场景,一个具有PerspectiveCamera和一个带OrthogographicCamera。我在不清除 z 缓冲区的情况下按顺序渲染它们(渲染器的autoClear属性设置为false)。我面临的问题是,我需要同步每个场景中对象的放置,以便为一个场景中的对象分配一个 z 位置,该位置位于另一个场景中位于它之前的对象之后,但位于其之前的对象之前在它后面。
为此,我将我的透视场景指定为“领先”场景,即。所有对象的所有坐标(透视和正交)都是基于这个场景分配的。透视对象直接使用这些坐标并在该场景中使用透视相机进行渲染。正交对象的坐标被转换为正交场景中的坐标,然后使用正交相机在该场景中渲染。我通过将透视场景中的坐标投影到透视相机的视图窗格,然后使用正交相机返回到正交场景来进行转换:
position.project(perspectiveCamera).unproject(orthogographicCamera);
Run Code Online (Sandbox Code Playgroud)
唉,这并不像预期的那样工作。正交对象总是在透视对象之前渲染,即使它们应该在它们之间。考虑这个例子,其中蓝色圆圈应该显示在红色方块后面,但在绿色方块之前(它不是):
var pScene = new THREE.Scene();
var oScene = new THREE.Scene();
var pCam = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 1000);
pCam.position.set(0, 40, 50);
pCam.lookAt(new THREE.Vector3(0, 0, -50));
var oCam = new THREE.OrthographicCamera(window.innerWidth / -2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / -2, 1, 500);
oCam.Position = pCam.position.clone();
pScene.add(pCam);
pScene.add(new THREE.AmbientLight(0xFFFFFF)); …Run Code Online (Sandbox Code Playgroud) javascript camera projection coordinate-transformation three.js
我有一个非常普遍的问题.我希望确定多个物体的边界点(包括30-50个闭合多边形(z),每个具有大约300个点(x,y,z)).我正在使用固定视口,该视口围绕x,y和z轴旋转(alpha,beta,gamma),这是多边形坐标系的原点.
我认为它有两种可能性:透视投影或光线追踪.透视投影似乎需要对每个点进行大量矩阵运算,以确定其位置是否在视口内.或者给定大量的点我最好将视口像素光线追踪到对象?即确定是否存在交叉点,然后确定是否在对象内或外交叉处发生交叉.在任何一种情况下,我都会将此结果写为0(外部)或1(内部)到200x200,表示视口的整数矩阵
谢谢你的期待
projection ×10
javascript ×2
matrix ×2
r ×2
three.js ×2
2d ×1
activerecord ×1
c++ ×1
camera ×1
cdo-climate ×1
d3.js ×1
lambda ×1
linq-to-sql ×1
math ×1
netcdf ×1
nhibernate ×1
perspective ×1
python ×1
raytracing ×1
replace ×1