コード例 #1
0
        public void trainSystem(string fileDirectory, string dbFile) {

            //Eğitim veritabanını oluştur
            Stream fileStream = new FileStream(dbFile, FileMode.Create, FileAccess.Write);
            IFormatter formatter = new BinaryFormatter();

            //Eğitim dizinindeki bütün bitmap dosyalarını listele
            string[] filePaths = getFiles(fileDirectory, "*.gif|*.jpg|*.png|*.bmp", SearchOption.AllDirectories);

            Int32 numOfImages = filePaths.Length;
            formatter.Serialize(fileStream, numOfImages);  //Görüntü sayısını dosyaya yaz

            Bitmap bm;

            //Her dosya için 64bin histogram ve dosya isminden oluşan bir nesne oluştur
            //Oluşturulan nesneyi serileştirerek dosyaya kaydet
            for (int i=0; i<filePaths.Length; i++)
            {
                bm = (Bitmap)Bitmap.FromFile(filePaths[i]);
                ImageRecord newRecord = new ImageRecord();
                newRecord.histogram = generate64binHistogram(bm);
                newRecord.fileName = filePaths[i];

                formatter.Serialize(fileStream,newRecord);

                progressBar1.Value = i*100/filePaths.Length;
            }

            fileStream.Close();
        }
コード例 #2
0
ファイル: Importer.cs プロジェクト: derek-cap/FodicomTest
        private static ImageRecord ToImage(DicomDirectoryRecord record)
        {
            ImageRecord image = new ImageRecord();

            image.SOPInstanceUID   = record.GetSingleValue <string>(DicomTag.ReferencedSOPInstanceUIDInFile);
            image.ImageNumber      = record.GetSingleValueOrDefault <string>(DicomTag.InstanceNumber, null);
            image.ReferencedFileID = record.GetValueOrDefault <string>(DicomTag.ReferencedFileID, 0, null);

            return(image);
        }
コード例 #3
0
        public string GetImageByID(string id)
        {
            ImageRecord expectedResult = new ImageRecord
            {
                Id    = "phile",
                Image = "bla",
                Title = "Hello world"
            };

            return(expectedResult.ToJson());
        }
コード例 #4
0
        /// <summary>
        /// 单击上传图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnuploading_Click(object sender, EventArgs e)
        {
            try
            {
                bool bo = false;
                //得到图片的路径
                string path = txtpath.Text.Trim();
                if (path.Trim() == "")
                {
                    MessageBox.Show("请选择图片地址");
                    return;
                }
                for (int i = 0; i < ListPath.Count; i++)
                {
                    string num     = FWpath + "\\" + DateTime.Now.Year + "\\" + DateTime.Now.ToString("yyyyMMdd") + "\\";
                    string picName = ImageFile.UpLoadFile(ListPath[i], num);//上传图片到指定路径
                    //添加上传记录
                    //insert into ImageRecord values(之间编号,'xx/aa.jpg','2013-05-06','啊啊啊啊啊')

                    if (picName != "")
                    {
                        ImageRecord img = new ImageRecord();
                        img.ImageRecord_Unusual_Id = UnusualId;//改为用异常编号关联
                        img.ImageRecord_ImageName  = picName;
                        img.ImageRecord_Time       = DateTime.Now;
                        img.ImageRecord_Remark     = null;
                        if (!ImageRecordDAL.InsertOneQCRecord(img))
                        {
                            bo = false;
                            MessageBox.Show("上传失败");
                            return;
                        }
                        else
                        {
                            bo = true;
                        }
                    }
                }
                if (bo)
                {
                    MessageBox.Show("上传成功!");
                    Dispose();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("上传时发生错误!错误原因是" + ex.Message);
            }
        }
コード例 #5
0
ファイル: SchLibRenderer.cs プロジェクト: Fermium/AltiumSharp
        private void RenderImagePrimitive(Graphics g, ImageRecord image)
        {
            var rect = ScreenFromWorld(image.CalculateBounds());

            if (_embeddedImages.TryGetValue(image.Filename, out var img))
            {
                g.DrawImage(img, rect);
            }

            if (image.IsSolid)
            {
                var penWidth = ScaleLineWidth(image.LineWidth);
                using (var pen = CreatePen(image.Color, penWidth, lineJoin: LineJoin.Miter))
                {
                    DrawingUtils.DrawRectangle(g, pen, rect);
                }
            }
        }
コード例 #6
0
        /// <summary>
        /// 新增一条质检记录
        /// </summary>
        /// <param name="qcRecord">质检实体</param>
        /// <returns></returns>
        public static bool InsertOneQCRecord(ImageRecord qcRecord)
        {
            bool rbool = true;

            using (DCQUALITYDataContext db = new DCQUALITYDataContext())
            {
                try
                {
                    db.ImageRecord.InsertOnSubmit(qcRecord);
                    db.SubmitChanges();
                    rbool = true;
                }
                catch
                {
                    rbool = false;
                }
                finally { db.Connection.Close(); }
            }
            return(rbool);
        }
コード例 #7
0
ファイル: FunctionTest.cs プロジェクト: wilmsoft/intelli-Gram
        public async Task TestSingleImageGet()
        {
            // Arrange
            var         function       = new Function("bob");
            var         context        = new TestLambdaContext();
            ImageRecord expectedResult = new ImageRecord
            {
                Id    = "bob",
                Image = "bla",
                Title = "Hello world"
            };

            // Act
            string id  = "bob";
            string sut = function.GetImageByID(id);

            ImageRecord actualResult = ImageRecord.FromJson(sut);

            // Assert
            // Assert.Equal(expectedResult.Id, actualResult.Id);
            Assert.True(expectedResult.Equals(actualResult));
        }
コード例 #8
0
        public void RateLimitedFromResponse()
        {
            var album = CreateAlbum(new List <string> {
                CreateImageModel()
            });

            mMockClient.SetResponse("/album/abc", new MockHttpResponse
            {
                Content = album,
                Headers = LimitedHeaders
            });

            var task = mDetector.DetectImagesAsync(new Uri($"{BaseUrl}/a/abc"));

            task.Wait();

            var imageRecord = new ImageRecord {
                Format = ImageFormat.Jpg, Url = new Uri(DefaultUrl)
            };

            Assert.NotEmpty(task.Result);
            Assert.Equal(expected: imageRecord, actual: task.Result[0]);
            Assert.Equal(expected: ImageDetectorState.RateLimited, actual: mDetector.State);
        }
コード例 #9
0
        /// <summary>
        /// Create a image record from <see cref="DicomDataset"/>.
        /// Becareful: filename is null.
        /// </summary>
        /// <param name="dcmData"><see cref="DicomDataset"/></param>
        /// <returns>Image record <see cref="{DataModel.ImageRecord}"/></returns>
        public static ImageRecord CreateImage(this DicomDataset dcmData)
        {
            string imageUID  = dcmData.Get <string>(DicomTag.SOPInstanceUID);
            string seriesUID = dcmData.Get <string>(DicomTag.SeriesInstanceUID);
            var    record    = new ImageRecord(imageUID, seriesUID);                        // 0, 1

            record.ImageNumber = dcmData.Get <ushort>(DicomTag.InstanceNumber, 0, 0);       // 2

            string sliceThickness = dcmData.Get <string>(DicomTag.SliceThickness, 0, null); // 3

            if (string.IsNullOrEmpty(sliceThickness) == false)
            {
                double st = 0;
                double.TryParse(sliceThickness, out st);
                record.SliceThickness = st;
            }

            ushort rows    = dcmData.Get <ushort>(DicomTag.Rows, 0, 0);
            ushort columns = dcmData.Get <ushort>(DicomTag.Columns, 0, 0);

            record.Matrix = $"{rows}x{columns}";

            return(record);
        }
コード例 #10
0
ファイル: SchLibReader.cs プロジェクト: vehar/AltiumSharp
        /// <summary>
        /// Instantiates a record according to its record type number.
        /// </summary>
        /// <param name="recordType">Integer representing the record type.</param>
        /// <returns>A new empty instance of a record primitive.</returns>
        private SchPrimitive CreateRecord(int recordType)
        {
            SchPrimitive record;

            switch (recordType)
            {
            case 1:
                record = new SchComponent();
                break;

            case 2:
                record = new PinRecord();
                break;

            case 3:
                record = new SymbolRecord();
                break;

            case 4:
                record = new TextStringRecord();
                break;

            case 5:
                record = new BezierRecord();
                break;

            case 6:
                record = new PolylineRecord();
                break;

            case 7:
                record = new PolygonRecord();
                break;

            case 8:
                record = new EllipseRecord();
                break;

            case 9:
                record = new PieChartRecord();
                break;

            case 10:
                record = new RoundedRectangleRecord();
                break;

            case 11:
                record = new EllipticalArcRecord();
                break;

            case 12:
                record = new ArcRecord();
                break;

            case 13:
                record = new LineRecord();
                break;

            case 14:
                record = new RectangleRecord();
                break;

            case 28:
            case 209:
                record = new TextFrameRecord();
                break;

            case 30:
                record = new ImageRecord();
                break;

            case 34:
                record = new Record34();
                break;

            case 41:
                record = new Record41();
                break;

            case 44:
                record = new Record44();
                break;

            case 45:
                record = new Record45();
                break;

            case 46:
                record = new Record46();
                break;

            case 48:
                record = new Record48();
                break;

            default:
                EmitWarning($"Record {recordType} not supported");
                record = new SchPrimitive();
                break;
            }

            return(record);
        }
コード例 #11
0
        private string getImageUrl(ImageRecord img)
        {
            string baseUrl = Request.Scheme + "://" + (new Uri(Request.GetDisplayUrl())).Authority.TrimEnd('/') + "/filestorage/";

            return(baseUrl + img.File.FilePath);
        }
コード例 #12
0
        public List <ImageRecord> QueryImage(string queryImagePath, object argument = null)
        {
            List <ImageRecord> rtnImageList = new List <ImageRecord>();

            CEDD_Descriptor.CEDD cedd = new CEDD_Descriptor.CEDD();

            int goodMatchDistance = 35;

            if (argument != null && argument is Int32)
            {
                goodMatchDistance = (int)argument;
            }

            double[] queryCeddDiscriptor;
            using (Bitmap bmp = new Bitmap(Image.FromFile(queryImagePath)))
            {
                queryCeddDiscriptor = cedd.Apply(bmp);
            }

            Stopwatch             sw       = Stopwatch.StartNew();
            BKTree <CEDDTreeNode> ceddTree = null;

            if (!CacheHelper.Get <BKTree <CEDDTreeNode> >("CeddIndexTree", out ceddTree))
            {
                CEDDRepository <BKTree <CEDDTreeNode> > repo = new CEDDRepository <BKTree <CEDDTreeNode> >();
                ceddTree = repo.Load();
                if (ceddTree == null)
                {
                    throw new InvalidOperationException("Please index CEDD with BK-Tree before querying the Image");
                }
                CacheHelper.Add <BKTree <CEDDTreeNode> >(ceddTree, "CeddIndexTree");
            }
            sw.Stop();
            Debug.WriteLine("Load tooked {0} ms", sw.ElapsedMilliseconds);


            CEDDTreeNode queryNode = new CEDDTreeNode
            {
                Id             = 0,
                ImagePath      = queryImagePath,
                CEDDDiscriptor = queryCeddDiscriptor
            };

            sw.Reset(); sw.Start();
            Dictionary <CEDDTreeNode, Int32> result = ceddTree.query(queryNode, goodMatchDistance);

            sw.Stop();
            Debug.WriteLine("Query tooked {0} ms", sw.ElapsedMilliseconds);

            foreach (KeyValuePair <CEDDTreeNode, Int32> ceddNode in result)
            {
                ImageRecord rec = new ImageRecord
                {
                    Id        = ceddNode.Key.Id,
                    ImageName = ceddNode.Key.ImageName,
                    ImagePath = ceddNode.Key.ImagePath,
                    Distance  = ceddNode.Value
                };
                rtnImageList.Add(rec);
            }

            rtnImageList = rtnImageList.OrderBy(x => x.Distance).ToList();
            return(rtnImageList);
        }
コード例 #13
0
ファイル: ImageReader.cs プロジェクト: foolmoron/Inlight2017
    IEnumerator MainReader()
    {
        var x = new Stopwatch();

        while (true)
        {
            // get file index if changed
            if (File.GetLastWriteTime(indexPath) > lastIndexWrite)
            {
                lastIndexWrite = File.GetLastWriteTime(indexPath);
                files.Clear();
                types.Clear();
                facings.Clear();
                using (var fileReader = File.OpenText(indexPath)) {
                    while (!fileReader.EndOfStream)
                    {
                        var line = fileReader.ReadLine() ?? "";
                        files.Add(line.Substring(0, 36));                   // 36 char uuid
                        types.Add(CHAR_TO_TYPE[line[line.Length - 3]]);     // type
                        facings.Add(CHAR_TO_FACING[line[line.Length - 1]]); // facing
                    }
                }
            }
            yield return(null);

            // loop files
            for (var i = 0; i < files.Count; i++)
            {
                var file   = files[i];
                var type   = types[i];
                var facing = facings[i];
                var path   = root + file + ".png";
                var record = Records.Find(path, (r, p) => r.Path == p);
                // create if new file in directory
                if (record == null)
                {
                    record = new ImageRecord {
                        Name    = file,
                        Path    = root + file + ".png",
                        Texture = new Texture2D(2, 2),
                    };
                    record.Texture.wrapMode = TextureWrapMode.Clamp; // eliminate slight artifacts at edges of image
                    Records.Add(record);
                    recordsJustAdded.Add(record);
                    yield return(null);
                }
                // update record metadata
                record.Type = type;
                if (record.Facing != facing)
                {
                    // update facing and cached material scale
                    record.Facing = facing;
                    var mats = MaterialsCache.Get(record.Texture);
                    if (mats != null)
                    {
                        mats.SetFlip(record.Facing == ImageFacing.Left);
                    }
                }
                yield return(null);

                // update file if image was changed
                if (File.Exists(record.Path) && File.GetLastWriteTime(record.Path) > record.LastUpdated)
                {
                    // do all file-reading work in one atomic chunk
                    record.LastUpdated = File.GetLastWriteTime(record.Path);
                    record.Texture.LoadImage(File.ReadAllBytes(record.Path));
                    yield return(endOfFrame);

                    var pixels = record.Texture.GetPixels32(ImageRecord.MAIN_COLOR_MIP_LEVEL);
                    yield return(null);

                    List <Color> topColors;
                    record.MainColor = GetMainColorFromPixels(pixels, out topColors, 2); // blend top 2 colors
                    record.Color1    = topColors[0];
                    record.Color2    = topColors[1];
                    yield return(null);

                    record.Dimensions = new Vector2(record.Texture.width / 100f, record.Texture.height / 100f);
                    OnUpdated(record);
                }
                yield return(null);
            }
            // remove record and quad if file is deleted
            for (int i = 0; i < Records.Count; i++)
            {
                if (!File.Exists(Records[i].Path))
                {
                    var record = Records[i];
                    Records.RemoveAt(i);
                    OnRemoved(record);
                    i--;
                }
                yield return(null);
            }
            // sort by age ascending
            Records.Sort((r1, r2) => - r1.LastUpdated.CompareTo(r2.LastUpdated));
            yield return(null);

            // call added events
            foreach (var record in recordsJustAdded)
            {
                OnAdded(record);
            }
            recordsJustAdded.Clear();
            // wait until next frame
            yield return(endOfFrame);
        }
    }
コード例 #14
0
        public ImageRecord[] findresemblances(string testImagePath, List<ImageRecord> histogramList)
        {

            Bitmap testImage = (Bitmap)Bitmap.FromFile(testImagePath);
            
            double[] testHistogram = generate64binHistogram(testImage);

            double[] minimum3dist = new double[3];
            ImageRecord[] minimum3Records = new ImageRecord[3];

            minimum3dist[0] = minimum3dist[1] = minimum3dist[2] = Double.MaxValue;

            foreach (ImageRecord imageRecord in histogramList) //en kısa uzaklıktaki 3 görüntü kaydını bul
            {
                double dist = manhattanDistance(testHistogram, imageRecord.histogram);
                if (dist < minimum3dist[0])
                {
                    minimum3dist[0] = dist;
                    minimum3Records[0] = imageRecord;
                }
                else if (dist < minimum3dist[1])
                {
                    minimum3dist[1] = dist;
                    minimum3Records[1] = imageRecord;
                }
                else if (dist < minimum3dist[2])
                {
                    minimum3dist[2] = dist;
                    minimum3Records[2] = imageRecord;
                }
            }
            return minimum3Records;
        }
コード例 #15
0
        public static int Build(EFContext db, string fileExt, string fileName, string fullFilePath, string path, int fileId, string name)
        {
            {
                var group = new ImageGroup();
                group.Name    = name;
                group.Updated = DateTime.UtcNow;
                group.Active  = true;
                db.ImageGroups.Add(group);
                db.SaveChanges();

                var img = new ImageRecord();
                img.Name         = name;
                img.FileId       = fileId;
                img.ImageGroupId = group.Id;
                img.ImageSize    = ImageSize.src;
                db.Images.Add(img);
                db.SaveChanges();

                // image resizing
                int w; int h;

                var f2048    = fileName + "_h2048." + fileExt;
                var file2048 = Path.Combine(path, f2048);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file2048, ImageSize.h2048, out w, out h))
                {
                    var fileInfo = new FileInfo(file2048);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f2048, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h2048;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f1024    = fileName + "_h1024." + fileExt;
                var file1024 = Path.Combine(path, f1024);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file1024, ImageSize.h1024, out w, out h))
                {
                    var fileInfo = new FileInfo(file1024);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f1024, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h1024;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f720    = fileName + "_h720." + fileExt;
                var file720 = Path.Combine(path, f720);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file720, ImageSize.h720, out w, out h))
                {
                    var fileInfo = new FileInfo(file720);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f720, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h720;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f480    = fileName + "_h480." + fileExt;
                var file480 = Path.Combine(path, f480);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file480, ImageSize.h480, out w, out h))
                {
                    var fileInfo = new FileInfo(file480);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f480, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h480;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f240    = fileName + "_h240." + fileExt;
                var file240 = Path.Combine(path, f240);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file240, ImageSize.h240, out w, out h))
                {
                    var fileInfo = new FileInfo(file240);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f240, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h240;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f128    = fileName + "_h128." + fileExt;
                var file128 = Path.Combine(path, f128);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file128, ImageSize.h128, out w, out h))
                {
                    var fileInfo = new FileInfo(file128);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f128, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h128;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f64    = fileName + "_h64." + fileExt;
                var file64 = Path.Combine(path, f64);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file64, ImageSize.h64, out w, out h))
                {
                    var fileInfo = new FileInfo(file64);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f64, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h64;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                var f32    = fileName + "_h32." + fileExt;
                var file32 = Path.Combine(path, f32);
                if (ImageResizeService.ResizeImageFile(fullFilePath, file32, ImageSize.h32, out w, out h))
                {
                    var fileInfo = new FileInfo(file32);
                    var sizekb   = fileInfo.Length * 0.001M;
                    var f        = new FileRecord()
                    {
                        FilePath = f32, Key = name, FileExt = fileExt, Name = fileName, FileType = FileType.Image, SizeKb = sizekb
                    };
                    db.Files.Add(f);
                    db.SaveChanges();
                    var i = new ImageRecord()
                    {
                        FileId = f.Id, Name = name, Width = w, Height = h
                    };
                    i.ImageGroupId = group.Id;
                    i.ImageSize    = ImageSize.h32;
                    db.Images.Add(i);
                    db.SaveChanges();
                }

                db.SaveChanges();

                return(group.Id);
            }
        }
コード例 #16
0
ファイル: Spawner.cs プロジェクト: foolmoron/Inlight2017
    public void Spawn(ImageRecord record)
    {
        // spawn
        var startPos = new Vector2(transform.position.x, transform.position.z) + Random.insideUnitCircle.normalized * Mathf.Lerp(MinDistance, MaxDistance, Random.value);
        var target   = SpawnViewTargets.Find(possibleTarget => possibleTarget.gameObject.activeInHierarchy);

        if (target)
        {
            var forward = target.forward.withY(0).normalized; // spawn in player's view
            var dir     = Quaternion.AngleAxis(Mathf.Lerp(-AngleRange, AngleRange, Random.value), Vector3.up);
            startPos = dir * forward * Mathf.Lerp(MinDistance, MaxDistance, Random.value);
        }
        RaycastHit hit;

        Physics.Raycast(new Vector3(startPos.x, 300, startPos.y), Vector3.down, out hit, 500, CollisionLayers.value);
        var spawnPos = hit.point.plusY(HeightOffsetFromGround);

        if (record.Type == ImageType.Animal)
        {
            if (DoNestOnAnimalSpawn)
            {
                // small patch of grass
                var plantRecord = ImageReader.Inst.GetWeightedRandomRecord(ImageType.Plant);
                var seedObj     = Instantiate(SeedPrefab);
                seedObj.transform.position = spawnPos;
                seedObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = plantRecord;
                seedObj.GetComponentInSelfOrChildren <Seed>().WillGrowPlant    = true;
                seedObj.GetComponentInSelfOrChildren <Seed>().ForcedType       = ImageType.TinyPatch;
                // nest that keeps spawning eggs
                var nestObj = Instantiate(NestPrefab);
                nestObj.transform.position = spawnPos;
                nestObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = record;
            }
            // egg
            var eggObj = Instantiate(EggPrefab);
            eggObj.transform.position = spawnPos;
            eggObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = record;
            eggObj.GetComponentInSelfOrChildren <Egg>().AutoBreak         = true;
            eggObj.GetComponentInSelfOrChildren <Egg>().ForceGroupParams  = true;
        }
        else if (record.Type == ImageType.Bird)
        {
            // bird is an animal
            var eggObj = Instantiate(EggPrefab);
            eggObj.transform.position = spawnPos;
            eggObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = record;
            eggObj.GetComponentInSelfOrChildren <Egg>().AutoBreak         = true;
            eggObj.GetComponentInSelfOrChildren <Egg>().ForceGroupParams  = true;
            eggObj.GetComponentInSelfOrChildren <Egg>().AnimalPrefab      = BirdPrefab;
        }
        else if (record.Type == ImageType.Plant)
        {
            // any type of plant
            var seedObj = Instantiate(SeedPrefab);
            seedObj.transform.position = spawnPos;
            seedObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = record;
            seedObj.GetComponentInSelfOrChildren <Seed>().WillGrowPlant    = true;
        }
        else if (record.Type == ImageType.Building)
        {
            // building is a tree
            var seedObj = Instantiate(SeedPrefab);
            seedObj.transform.position = spawnPos;
            seedObj.GetComponentInSelfOrChildren <HasImageRecord>().Record = record;
            seedObj.GetComponentInSelfOrChildren <Seed>().WillGrowPlant    = true;
            seedObj.GetComponentInSelfOrChildren <Seed>().ForcedType       = ImageType.Tree;
        }
    }