示例#1
0
        public void Render(IDoseObject doseObject, Camera camera, IRenderContext context, Rectd screenRect, LineType lineType)
        {
            if (doseObject == null || doseObject.Grid == null)
            {
                return;
            }

            if (doseObject.Grid.GetNormalisationAmount() == 0)
            {
                return;
            }

            //Translates screen to world points and vice versa
            var ms = new MarchingSquares();
            List <PlanarPolygon> polygons = new List <PlanarPolygon>();
            var interpolatedDoseGrid      = new InterpolatedDoseGrid(doseObject, MaxNumberOfGridPoints, camera, screenRect);

            foreach (ContourInfo contourInfo in ContourInfo)
            {
                var contour = ms.GetContour(interpolatedDoseGrid.Data, interpolatedDoseGrid.Rows, interpolatedDoseGrid.Columns, interpolatedDoseGrid.Coords, contourInfo.Threshold, contourInfo.Color);
                //var polygon = contour.ToPlanarPolygon(camera);

                Point2d screenPoint1 = new Point2d();
                Point2d screenPoint2 = new Point2d();
                Point3d worldPoint1  = new Point3d();
                Point3d worldPoint2  = new Point3d();

                var screenVertices = getScreenVertices(contour.Vertices, camera);

                context.DrawLines(screenVertices, contourInfo.Color);
            }
        }
示例#2
0
 private void AddDoseObject(IDoseObject doseObject)
 {
     Doses.Add(doseObject);
     foreach (SelectableObject <RegionOfInterest, DoseVolumeHistogram> selectableRegionOfInterest in RegionOfInterests)
     {
         var dvh = new DoseVolumeHistogram(doseObject, selectableRegionOfInterest.Value);
         selectableRegionOfInterest.AddChild(new SelectableObject <DoseVolumeHistogram>(dvh));
     }
 }
示例#3
0
        public async Task <DoseVolumeHistogram> Build(IDoseObject dose, RegionOfInterest roi)
        {
            var pi = ProgressService.CreateNew("Building DVH... ", false);
            DoseVolumeHistogram dvh = null;
            await Task.Run(() =>
            {
                dvh = new DoseVolumeHistogram(dose, roi);
                dvh.Compute();
            }
                           );

            ProgressService.End(pi);
            return(dvh);
        }
示例#4
0
        public DoseVolumeHistogram(IDoseObject dose, RegionOfInterest roi, int nbins)
        {
            DoseObject = dose;
            ROIObject  = roi;
            NBins      = nbins;

            Dose = new double[NBins];
            for (int i = 0; i < Dose.Length; i++)
            {
                Dose[i] = i;
            }
            CumulativeVolume = new double[NBins];
            for (int i = 0; i < Dose.Length; i++)
            {
                CumulativeVolume[i] = 1;
            }
        }
示例#5
0
        public InterpolatedDoseGrid(IDoseObject doseObject, int maxNumberOfGrids, Camera camera, Rectd normRect)
        {
            //Intersect the camera screen and cube surrounding the dose object to limit the rendering.
            var boundingRect = camera.GetBoundingScreenRect(doseObject.Grid.XRange, doseObject.Grid.YRange, doseObject.Grid.ZRange, normRect);

            if (boundingRect == null)
            {
                return;
            }

            Rows    = maxNumberOfGrids;
            Columns = maxNumberOfGrids;

            var dy = boundingRect.Height / maxNumberOfGrids;
            var dx = boundingRect.Width / maxNumberOfGrids;

            Point2d screenPoint         = new Point2d(boundingRect.X, boundingRect.Y);
            var     normalisationAmount = doseObject.Grid.GetNormalisationAmount();
            Point3d worldPoint          = new Point3d();

            Coords = new double[Rows][][];
            Data   = new float[Rows][];
            Voxel voxel = new Voxel();

            for (int row = 0; row < Rows; row++)
            {
                Coords[row] = new double[Columns][];
                Data[row]   = new float[Columns];
                for (int col = 0; col < Columns; col++)
                {
                    screenPoint.X = boundingRect.X + col * dx;
                    screenPoint.Y = boundingRect.Y + row * dy;

                    camera.ConvertScreenToWorldCoords(screenPoint.Y, screenPoint.X, worldPoint);
                    Coords[row][col] = new double[3] {
                        worldPoint.X, worldPoint.Y, worldPoint.Z
                    };

                    doseObject.Grid.Interpolate(worldPoint, voxel);

                    Data[row][col] = (voxel.Value * doseObject.Grid.Scaling) / normalisationAmount;
                }
            }
        }
示例#6
0
 public DoseVolumeHistogram(IDoseObject dose, RegionOfInterest roi) : this(dose, roi, 200)
 {
 }
 public DoseObjectRenderMessage(IDoseObject doseObject, bool remove)
 {
     DoseObject = doseObject;
     RemoveDose = remove;
 }
示例#8
0
 private void RemoveDose(IDoseObject dose)
 {
     Doses.Remove(dose);
 }
示例#9
0
 private void AddDose(IDoseObject dose)
 {
     Doses.Add(dose);
 }