标签: projection

如何使用NHibernate Projections检索集合

我懒得加载集合,并且因为人员表中有这么多字段,我正在编写一个投影函数来仅检索某些属性.它适用于属性,而不是其他实体的集合.如果它们作为代理加载我会很好,我可以稍后得到它们,但是现在它只是加载null.

public IList<Person> ListTop40()
        {
            var list = _session.CreateCriteria(typeof(Person))
                   .SetProjection(Projections.ProjectionList()
                   .Add(Projections.Property("FirstName"))
                   .Add(Projections.Property("LastName"))
                   .Add(Projections.Property("Jersey"))
                   .Add(Projections.Property("FortyYard"))
                   .Add(Projections.Property("BenchReps"))
                   .Add(Projections.Property("VertJump"))
                   .Add(Projections.Property("ProShuttle"))
                   .Add(Projections.Property("LongJump"))
                   .Add(Projections.Property("PersonSchoolCollection"))
                    )
                    .List<IList>()
                    .Select(l => new Person() { FirstName = (string)l[0], LastName = (string)l[1], Jersey = (Decimal)l[2], FortyYard = (Decimal)l[3], BenchReps = (Decimal)l[4], VertJump = (Decimal)l[5], ProShuttle = (Decimal)l[6], LongJump = (Decimal)l[7], PersonSchoolCollection = (IList<Person_School>)l[8]});

            IList<Person> s = list.ToList();
            return s;
        }
Run Code Online (Sandbox Code Playgroud)

c# linq nhibernate lazy-loading projection

6
推荐指数
1
解决办法
8025
查看次数

NHibernate的预测

假设在一个实体中有属性id,用户名,年龄,地址.现在我只想要id和用户名,我使用这个代码.

预测允许从查询中返回除实体列表之外的其他内容.

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();
Run Code Online (Sandbox Code Playgroud)

我将如何检索值.在哪个对象中将采用这些值.

nhibernate projection resulttransformer

6
推荐指数
1
解决办法
1万
查看次数

透视分割后的Z值始终小于-1

所以我正在编写自己的自定义3D转换管道,以便更好地理解它是如何工作的.我可以正确地将所有内容渲染到屏幕上,现在我要回去查看裁剪.

根据我的理解,如果透视分割后的x或y值超出[-1,1]的范围,我应该剪切一个顶点,如果z值超出[0,1]的界限,我应该剪裁一个顶点.

但是,当我实现它时,我的z值始终为-1.xxxxxxxxxxx,其中xxxxxxx是一个非常小的数字.

这有点长,我道歉,但我想确保我提供了所有可能的信息.

第一个惯例:

我正在使用左手系统,其中Matrix看起来像这样:

[m00, m01, m02, m03]
[m10, m11, m12, m13]
[m20, m21, m22, m23]
[m30, m31, m32, m33]
Run Code Online (Sandbox Code Playgroud)

我的矢量是这样的列:

[x]
[y]
[z]
[w]
Run Code Online (Sandbox Code Playgroud)

我的相机设置为:

PI/4弧度的垂直FOV.

方位比1.(方形视口)

近剪辑值为1.

远剪辑值为1000.

初始世界x位置为0.

初始世界y位置为0.

初始世界z位置为-500.

相机向下看Z轴(0,0,1)

给定一个顶点,管道的工作方式如下:

步骤1:将顶点乘以相机矩阵.

第2步:将顶点乘以投影矩阵.

投影矩阵是:

[2.41421, 0,       0,         0]
[0        2.41421, 0,         0]
[0,       0,       1.001001,  1]
[0,       0,       -1.001001, 0]
Run Code Online (Sandbox Code Playgroud)

步骤3:将x,y和z分量乘以1/w.

第4步: [这就是问题所在]如果外边界,则剪切顶点.

第5步:转换为屏幕坐标.

我有一个示例顶点

(-100, -100, 0, 1)
Run Code Online (Sandbox Code Playgroud)

在乘以相机矩阵后,我得到:

(-100, -100, 500, 1)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为相对于相机,该顶点是左侧和下侧100个单位,前方500个单位.它也在1的近剪辑和1000的远剪辑之间.W仍然是1.

在乘以投影矩阵后,得到:

(-241.42135, -241.42135, …
Run Code Online (Sandbox Code Playgroud)

opengl directx 3d projection

6
推荐指数
1
解决办法
1574
查看次数

IQueryable Lambda投影语法

我有一个IQueryable,其实体框架4对象我想投影到他们的DTO等价物.一个这样的对象'Person'是EF4类,相应的POCO PersonP是我定义的类.我正在使用Automapper在它们之间进行映射.但是,当我尝试以下代码时:

IQueryable<Person> originalModel = _repo.QueryAll();
IQueryable<PersonP> projection = originalModel.Select(e => Mapper.Map<Person, PersonP>(e));
Run Code Online (Sandbox Code Playgroud)

投影在运行时生成此错误:

LINQ to Entities does not recognize the method 'TestSite.Models.PersonP Map[Person,PersonP](TestSite.DataLayer.Model.Person)' method, and this method cannot be translated into a store expression.
Run Code Online (Sandbox Code Playgroud)

IQueryable<PersonP>使用Automapper 创建投影的合适语法是什么?谢谢.

PS Automapper配置正确 - 我在其他地方使用它在Person和PersonP之间来回转换,即Mapper.Map<Person, PersonP>(myPersonObject)正确返回一个PersonP对象.

编辑(更多代码):

我正在使用它来帮助函数将EF4实体POCO(PersonP)绑定到Telerik网格 - 由于它们包含循环引用(即导航属性),因此不会正确地序列化实体本身.我的代码看起来像这样:

public static GridModel GetGridModel<TEntity, TPoco>(IRepository<TEntity> repo, GridState gridState) where TEntity : EntityObject
{
 var originalModel = repo.QueryAll().ToGridModel(gridState);
 var projection = originalModel.Select(e => Mapper.Map<TEntity, TPoco>(e));


 return projection.ToGridModel(gridState); // applies filters, …
Run Code Online (Sandbox Code Playgroud)

lambda linq-to-objects linq-to-entities iqueryable projection

6
推荐指数
2
解决办法
5920
查看次数

如何将球形地图投影到球体/立方体上:"Equirectangular to cubic"

更新:我发现http://os.ivrpa.org/panosalado/wiki在java中有一个实现.任何在c或c ++中有相似之处的人?

我有这个全景图,来自google streetview的球形地图,并希望将其映射到球体/立方体上.下面是一些示例和插图,我寻求的是可以执行此操作的库或一些实现指南.

全景

我试过http://krpano.com/docu/tutorials/quickstart/#top,它给出了底部列出的结果.它说明了我想要的,但旋转轴关闭.我需要创建直接前后左右视图.理想我想将它映射到球体并告诉它提取的角度(立方体的方向).

[返回,下,前,左,右,上]

背部 下 字形 剩下 对 向上

c++ geometry opencv projection panoramas

6
推荐指数
1
解决办法
7782
查看次数

给定一组记录,我如何获得一个表示每个记录的数组的数组?

我必须翻译一些Fortran 90代码并找到一个有趣的语言功能.

例如,它们定义以下类型和动态数组变量:

TYPE WallInfo
  CHARACTER(len=40) :: Name
  REAL              :: Azimuth
  REAL              :: Tilt
  REAL              :: Area
  REAL              :: Height
END TYPE WallInfo

TYPE(WallInfo), ALLOCATABLE, DIMENSION(:) :: Wall
Run Code Online (Sandbox Code Playgroud)

稍后在代码中,他们调用一个函数:

CALL HeatFlow(Wall%Area, Wall%Azimuth)
Run Code Online (Sandbox Code Playgroud)

作为一名Delphi程序员,这让我感到有些不同,因为Wall是一系列记录!

从例程中的用法来看,很明显Fortran可以将记录数组中的字段作为自己的数组进行投影.

SUBROUTINE HeatFlow( Area, Azimuth )
  REAL, INTENT(IN), DIMENSION(:) :: Area
  REAL, INTENT(IN), DIMENSION(:) :: Azimuth
Run Code Online (Sandbox Code Playgroud)

有没有人知道是否有办法用Delphi(我使用的是2010版)?

我可以编写一个函数来将记录值提取为数组,但这有点单调乏味,因为我必须为每个字段编写一个专用例程(并且有很多).

我希望Delphi 2010中有一些我错过的语言功能.

arrays delphi record projection delphi-2010

6
推荐指数
2
解决办法
1708
查看次数

OpenCv StereoRectify中矩阵的精确定义

通常,投影矩阵P的定义是3x4矩阵,其将点从世界坐标投影到图像/像素坐标.投影矩阵可以分为:

  • K:具有内在参数的3x4相机矩阵K.
  • T:具有外部参数的4×4变换矩阵

投影矩阵是则P = ķ*Ť.

OpenCV的stereoRectify的以下输入有哪些明确的定义:

  • cameraMatrix1 - 第一个相机矩阵(我假设它是投影矩阵的内在K部分,对吗?).
  • R - 第一和第二摄像机的坐标系之间的旋转矩阵.('之间'是什么意思?是从cam1到cam2还是从cam2到cam1的旋转?)
  • T - 摄像机坐标系之间的平移向量.(同上面.是从cam1 - > cam2或cam2-> cam1的平移)
  • R1 - 为第一台摄像机输出3x3整流变换(旋转矩阵).(这是整流后的旋转,因此投影矩阵的新外部部分变为T1new = R1*T1old?)
  • P1 - 在第一台摄像机的新(整流)坐标系中输出3x4投影矩阵.("新坐标系中的投影矩阵"是什么意思?看来这个投影矩阵依赖于旋转矩阵R1来投影从世界坐标到图像/像素坐标的点,所以从上面的定义来看它既不是'投影矩阵'或'相机矩阵'但两者的某种混合物)

opencv transformation projection matrix

6
推荐指数
1
解决办法
3250
查看次数

通过.NET提高事件源预测到RDBMS(SQL)的性能

我目前正在研究C#中使用CQRS和事件源的原型,并且在我对SQL数据库的预测中遇到了性能瓶颈.

我的第一个原型是使用Entity Framework 6构建的,代码优先.这个选择主要是为了开始,因为读取方将受益于LINQ.

每个(适用的)事件都由多个投影使用,这些投影可以创建或更新相应的实体.

这样的投影目前看起来像这样:

public async Task HandleAsync(ItemPlacedIntoStock @event)
{
    var bookingList = new BookingList();
    bookingList.Date = @event.Date;
    bookingList.DeltaItemQuantity = @event.Quantity;
    bookingList.IncomingItemQuantity = @event.Quantity;
    bookingList.OutgoingItemQuantity = 0;
    bookingList.Item = @event.Item;
    bookingList.Location = @event.Location;
    bookingList.Warehouse = @event.Warehouse;

    using (var repository = new BookingListRepository())
    {
        repository.Add(bookingList);
        await repository.Save();
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是很好的表现,很可能是因为我调用DbContext.SaveChanges()了这个IRepository.Save()方法.每个活动一个.

我接下来应该探索哪些选择?我不想花几天时间追逐那些可能只是稍微好一点的想法.

我目前看到以下选项:

  • 坚持使用EF,但只要投影在后面运行,就可以批处理事件(即每X次事件的新/保存上下文).
  • 尝试执行更多低级SQL,例如使用ADO.NET.
  • 不要使用SQL来存储投影(即使用NoSQL)

我希望看到数百万个事件,因为我们计划采用大型遗留应用程序并以事件的形式迁移数据.新的预测也会经常添加,因此处理速度是一个实际问题.

基准:

  • 当前的解决方案(EF,在每个事件之后保存)每秒处理~200个事件(每个投影).它不直接与活动投影的数量成比例(即N个投影处理小于N*200个事件/秒).
  • 当预测没有保存上下文时,事件/秒的数量略有增加(小于两倍)
  • 当投影没有做任何事情(单一返回语句)时,我的原型管道的处理速度是全局~30,000事件/秒

更新的基准

  • 通过ADO.NET进行单线程插入TableAdapter(每次迭代时都是新的DataSet和新的TableAdapter):~2.500次插入/秒.没有使用投影管道进行测试,而是单独测试
  • 通过ADO.NET的单线程插入TableAdapter,SELECT插入后不插入:~3000插入/秒
    • TableAdapter10.84行的单线程ADO.NET …

.net c# rdbms projection event-sourcing

6
推荐指数
1
解决办法
941
查看次数

事件源:使投影中的关系不规范

我正在研究CQRS / ES体系结构。我们将多个异步投影并行运行到读取存储中,因为某些投影可能比其他投影慢得多,并且我们希望与写入端保持更多同步,以实现更快的投影。

我正在尝试了解有关如何生成读取模型以及可能需要进行多少数据重复的方法。

让我们以带有物料的订单作为简化示例。一个订单可以有多个项目,每个项目都有一个名称。项目和订单是单独的汇总。

我可以尝试以更规范的方式保存读取的模型,在该模型中,我为每个项目创建实体或文档并订购,然后对其进行引用-或者我可能想以更规范化的方式在有订单的情况下保存它其中包含项目。

归一化

{
  Id: Order1,
  Items: [Item1, Item2]
}

{
  Id: Item1,
  Name: "Foosaver 9000"
}

{
  Id: Item2,
  Name: "Foosaver 7500"
}
Run Code Online (Sandbox Code Playgroud)

使用更规范的格式将允许单个投影处理影响/影响物品和订单的事件并更新相应的对象。这也意味着项目名称的任何更改都会影响所有订单。例如,客户可能会收到与相应发票不同的其他物品的交货单(显然,该模型可能不够好,并导致我们面临与非规范化相同的问题...)

非正规化

{
  Id: Order1,
  Items: [
    {Id: Item1, Name: "Foosaver 9000"},
    {Id: Item2, Name: "Foosaver 7500"},
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是,反规范化将需要一些可以在其中查找当前相关数据的源(例如项目)。这意味着我要么必须传输事件中可能需要的所有信息,要么必须跟踪为非规范化而获取的数据。这也意味着我可能需要为每个投影执行一次操作(即,我可能需要一个非规范化的ItemForOrder以及一个非规范化的ItemForSomethingElse),它们都只包含每个非规范化实体或文档所需的最基本的属性(无论它们是什么时候)创建或修改)。

如果我要在读取存储中共享相同的物料,则最终可能会从不同的时间点混合物料定义,因为物料和订单的预测可能不会以相同的速度运行。在最坏的情况下,项目的投影可能尚未创建我需要为其属性来源的项目。

通常,在处理事件流中的关系时我有什么方法?


更新2016-06-17

目前,我正在通过针对每个非规范化读取模型及其相关数据运行单个投影来解决此问题。如果我有多个必须共享相同相关数据的读取模型,那么我可能会将它们放在同一投影中,以避免重复查找所需的相同相关数据。

这些相关的模型甚至可能已被标准化,优化,但是我必须访问它们。我的投影是唯一读取和写入它们的东西,因此我确切地知道如何读取它们。

// related data 
public class Item 
{
  public Guid Id {get; set;}
  public string Name {get; set;}
  /* and whatever else …
Run Code Online (Sandbox Code Playgroud)

projection denormalization cqrs event-sourcing

6
推荐指数
1
解决办法
1210
查看次数

Unity C#在围绕移动轴旋转的目标上射击抛射物

我正在开发一个3D太空游戏,其中相机处于恒定的2D(自上而下)状态.我能够在以给定速度移动的目标上发射速度的射弹,并且每次击中它.大!那么如果那个目标在父母身边有一个角速度呢?我注意到如果目标有一个旋转的父对象,我的投影不正确,因为它没有考虑角速度.

我的初始代码是围绕以下假设构建的:

Position_target + Velocity_target * t = Position_shooter + Velocity_shooter * t + Bulletspeed * t
Run Code Online (Sandbox Code Playgroud)

我认为射手是静止的(或可能是移动的)并需要发射一个恒定大小的子弹.

我将上述内容简化为此

Delta_Position = Position_target - Position_shooter
Delta_Velocity = Velocity_target - Velocity_shooter

Delta_Position + Delta_Velocity * t = BulletSpeed * t
Run Code Online (Sandbox Code Playgroud)

平方双方我得到一个二次方程式,我可以求解给定的行列式结果或零.这很完美.我返回值,然后将目标的位置和当前速度投射到那个t,然后我有炮塔脚本,以给定的角速度朝着该点旋转.如果炮塔说它在所有轴上观察到的点在1%以内,它会以速度射击子弹,如果目标没有改变其航向或速度,它会100%命中.

我开始在我的船只/小行星上添加组件,这些组件是父对象的子项,就像连接到炮塔本身为目标的船只的炮塔.如果船围绕轴旋转(例如Y轴)并且炮塔不在x = 0且z = 0,则我的投影不再起作用.我认为使用r*sin(theta + omega*t)作为X位置的角速度分量和使用Z位置的r*cos(theta + omega*t)可以起作用.Theta是当前旋转(相对于世界坐标),omega是围绕y轴的eulerAngle旋转.

我很快就意识到这只适用于围绕y轴旋转,我不能将sin置于二次方程式中,因为我无法从中提取t因此我无法真正适当地投影.我尝试使用双曲线,但情况相同.我可以创建一个任意的t,假设t = 2,并计算对象在2秒内的位置.但我正在努力寻找一种方法来实现子弹速度投射.

Position_targetparent + Velocity_targetparent * t + [ANGULAR VELOCITY COMPONENT] = Position_shooter + Velocity_shooter * t + Bulletspeed * t

Delta_Position_X + Delta_Velocity_X * t + S * t = …
Run Code Online (Sandbox Code Playgroud)

c# physics projection kinematics unity-game-engine

6
推荐指数
1
解决办法
271
查看次数