/// <summary> /// 构造函数,参数为大地坐标 /// </summary> /// <param name="start">大地坐标</param> /// <param name="end">大地坐标</param> public LineCrossGrid3D(Point start, Point end) { this.isCalc = this.Init(); if (!this.isCalc) { return; } GridHelper.getInstance().getMaxGGridXY(ref this.maxgxid, ref this.maxgyid); this.isCalc = !PointComparer.Equals1(start, end) && GridHelper.getInstance().PointXYZToGrid3D(start, ref this.cur); if (!this.isCalc) { return; } Vector3D dir = Vector3D.constructVector(start, end); this.line.setLine(start, dir); this.stepx = (this.line.paraEqua.X < 0 ? -1 : 1); this.stepy = (this.line.paraEqua.Y < 0 ? -1 : 1); this.stepz = (this.line.paraEqua.Z < 0 ? -1 : 1); Point ingrid = new Point(); this.isCalc = GridHelper.getInstance().PointXYZInGrid3D(start, ref ingrid); if (!this.isCalc) { return; } if (Math.Round(this.line.paraEqua.X, 3) == 0) { this.tx = this.dx = maxlength; } else if (this.line.paraEqua.X > 0) { this.dx = this.gridlength / this.line.paraEqua.X; this.tx = (this.gridlength - ingrid.X) / this.line.paraEqua.X; } else { this.dx = this.gridlength / (0 - this.line.paraEqua.X); this.tx = ingrid.X / (0 - this.line.paraEqua.X); } if (Math.Round(this.line.paraEqua.Y, 3) == 0) { this.ty = this.dy = maxlength; } else if (this.line.paraEqua.Y > 0) { this.dy = this.gridlength / this.line.paraEqua.Y; this.ty = (this.gridlength - ingrid.Y) / this.line.paraEqua.Y; } else { this.dy = this.gridlength / (0 - this.line.paraEqua.Y); this.ty = ingrid.Y / (0 - this.line.paraEqua.Y); } if (Math.Round(this.line.paraEqua.Z, 3) == 0) { this.tz = this.dz = maxlength;//因为tz太大,dz随便定义 } else if (this.line.paraEqua.Z > 0) { this.dz = this.vgridsize / this.line.paraEqua.Z; this.tz = (this.vgridsize - ingrid.Z) / this.line.paraEqua.Z; } else if (this.line.paraEqua.Z < 0) { this.dz = this.vgridsize / (0 - this.line.paraEqua.Z); this.tz = ingrid.Z / (0 - this.line.paraEqua.Z); } }