Exemplo n.º 1
0
    /**
     *  Set up the data object with empty UltrasoundPoint%s representing the points
     *  that need to be scanned.
     *
     *  This is analagous to setting up the view frustum in traditional 3D graphics.
     */
    private void EstablishScanningPlane(ref UltrasoundScanData data)
    {
        OnionLogger.globalLog.PushInfoLayer("Pre-populating data");

        UltrasoundProbeConfiguration config = data.GetProbeConfig();

        // nearZ and farZ represent near and far clipping "planes" (they're really arcs)
        float nearZ = config.GetMinScanDistance();
        float farZ  = config.GetMaxScanDistance();

        float arcSizeDegrees    = config.GetArcSizeInDegrees();
        int   scanlines         = config.GetNumberOfScanlines();
        int   pointsPerScanline = config.GetPointsPerScanline();

        for (int i = 0; i < scanlines; ++i)
        {
            UltrasoundScanline scanline = new UltrasoundScanline(config.GetPosition());
            float   angleInDegrees      = -(arcSizeDegrees / 2) + i * arcSizeDegrees / (scanlines - 1);
            float   angleInRadians      = Mathf.Deg2Rad * angleInDegrees;
            Vector2 trajectory          = new Vector2(Mathf.Sin(angleInRadians), Mathf.Cos(angleInRadians));

            for (int j = 0; j < pointsPerScanline; ++j)
            {
                float           d = nearZ + j * (farZ - nearZ) / (pointsPerScanline - 1);
                Vector2         positionOnPlane      = d * trajectory;
                Vector3         positionInWorldSpace = WorldSpaceFromProjectedPosition(positionOnPlane, config);
                UltrasoundPoint point = new UltrasoundPoint(positionInWorldSpace, positionOnPlane);
                scanline.AddUltrasoundPoint(point);
            }

            data.AddScanline(scanline);
        }

        OnionLogger.globalLog.PopInfoLayer();
    }
Exemplo n.º 2
0
    /// Checks an individual scanline for valid organs.
    /// @param scanline The UltrasoundScanline being tested
    /// @return A list of organs that are on the scanline.
    private IList <GameObject> ValidOrgansOnScanline(UltrasoundScanline scanline)
    {
        IList <UltrasoundPoint> points = scanline.GetPoints();

#if UNITY_EDITOR
        UltrasoundDebug.Assert(points.Count > 0, "Zero points on scanline", this);
#endif
        Vector3            terminalPoint   = points[points.Count - 1].GetWorldSpaceLocation();
        Ray                ray             = new Ray(scanline.origin, terminalPoint - scanline.origin);
        float              raycastDistance = (terminalPoint - scanline.origin).magnitude;
        RaycastHit[]       hits            = Physics.RaycastAll(ray, raycastDistance);
        IList <GameObject> validOrgans     = new List <GameObject>();
        foreach (RaycastHit hit in hits)
        {
            if (allOrgansInScene.Contains(hit.collider.gameObject))
            {
                validOrgans.Add(hit.collider.gameObject);
            }
        }

        return(validOrgans);
    }
    public UltrasoundScanData SendScanData()
    {
        UltrasoundProbeConfiguration config = new UltrasoundProbeConfiguration();

        config.SetMaxScanDistance(MAX_Y);
        config.SetMinScanDistance(MIN_Y);
        UltrasoundScanData data = new UltrasoundScanData(config);

        for (float i = MIN_X; i <= MAX_X; i += STEPSIZE)
        {
            UltrasoundScanline scanline = new UltrasoundScanline(config.GetPosition());

            for (float j = MIN_Y; j <= MAX_Y; j += STEPSIZE)
            {
                UltrasoundPoint p = new UltrasoundPoint(Vector3.zero, new Vector2(i * (j / MAX_Y), j));
                p.SetBrightness(Random.Range(0f, 1f));  // Generate noise.
                scanline.AddUltrasoundPoint(p);
            }

            data.AddScanline(scanline);
        }

        return(data);
    }