public void GenMountainPositionsForGridCell(List <MountainData> locs, Vector2i mountainPos, Vector2i chunkPos, int seed) { Vector2i mtChunk = new Vector2i((int)(mountainPos.X * MountainGridSize), (int)(mountainPos.Y * MountainGridSize)); Location chunkCenter = chunkPos.ToLocation() * Constants.CHUNK_WIDTH; MTRandom random = new MTRandom(39, (ulong)(mountainPos.X * 39 + mountainPos.Y + seed)); int count = random.Next(1, 3); for (int i = 0; i < count; i++) { int rangeSize; if (random.Next(10) > 5) { rangeSize = random.Next(5, 13); } else { rangeSize = random.Next(3, 8); } double ca = random.NextDouble(); double cb = random.NextDouble(); Vector2i centerMt = new Vector2i(mtChunk.X * Constants.CHUNK_WIDTH + (int)(ca * MountainGridSize * Constants.CHUNK_WIDTH), mtChunk.Y * Constants.CHUNK_WIDTH + (int)(cb * MountainGridSize * Constants.CHUNK_WIDTH)); double ch = random.NextDouble() * 512 + 512; double cradius = random.NextDouble() * ch * 0.25 + ch * 0.75; MountainData cmt = new MountainData() { Center = centerMt, Height = ch, Radius = cradius }; if (centerMt.ToLocation().DistanceSquared(chunkCenter) < (MountainMaxSizeBlocks * MountainMaxSizeBlocks)) { locs.Add(cmt); } double ph = ch; for (int r = 1; r < rangeSize; r++) { double ra = random.NextDouble() * 2.0 - 1.0; double rb = random.NextDouble() * 2.0 - 1.0; ra = ra > 0 ? Math.Max(r / (double)rangeSize, ra) : Math.Min(-r / (double)rangeSize, ra); rb = rb > 0 ? Math.Max(r / (double)rangeSize, rb) : Math.Min(-r / (double)rangeSize, rb); Vector2i rngMt = new Vector2i(centerMt.X + (int)(ra * MountainRangeRadius), centerMt.Y + (int)(rb * MountainRangeRadius)); double rh = random.NextDouble() * (ph * 0.5) + (ph * 0.5); double rradius = random.NextDouble() * rh * 0.25 + rh * 0.75; MountainData rmt = new MountainData() { Center = rngMt, Height = rh, Radius = rradius }; if (rngMt.ToLocation().DistanceSquared(chunkCenter) < (MountainMaxSizeBlocks * MountainMaxSizeBlocks)) { locs.Add(rmt); } } } }
public static string ConvertDataToString(MountainData data) { if (data == null) { return(null); } var xmlSerializer = new XmlSerializer(typeof(MountainData)); using (var textWriter = new StringWriter()) { xmlSerializer.Serialize(textWriter, data); return(textWriter.ToString()); } }
public double GetMountainHeightAt(MountainData mtd, double dx, double dy, bool precise) { lock (LockMountains[Math.Abs(mtd.Center.X * 39 + mtd.Center.Y) % LockMountains.Length]) { if (!MountainsGenerated.TryGetValue(new Vector2i(mtd.Center.X, mtd.Center.Y), out SimpleMountainGenerator smg)) { smg = SimpleMountainGenerator.PreGenerateMountain(mtd.Center.X, mtd.Center.Y); MountainsGenerated[new Vector2i(mtd.Center.X, mtd.Center.Y)] = smg; } double upScale = mtd.Radius * (2.0 / 512.0); int xCoord = (int)((dx - mtd.Center.X)); int yCoord = (int)((dy - mtd.Center.Y)); double h = smg.GetHeightAt(xCoord, yCoord, upScale, precise); return(h * mtd.Height * (1.0 / 255.0)); } }
public GCodeData GetMountainGCode(MountainData mountainData, GCodeConfiguration configuration) { var gCodeData = new GCodeData(); // TODO: convert mountainData to mountain var mountain = new GCodeMountain(mountainData, configuration); var preparationProcessor = new PreparationProcessor(); gCodeData.PreparationMoves = preparationProcessor.Process(mountain, configuration); var mainGCodeProcessor = new MainGCodeProcessor(); gCodeData.DirtyMoves = mainGCodeProcessor.ProcessDirty(mountain, configuration); gCodeData.CleanMoves = mainGCodeProcessor.ProcessClean(mountain, configuration); return(gCodeData); }
public GCodeMountain(MountainData mountainData, GCodeConfiguration config) { MountainWidthInGCode = config.FormSizeMMWidth; MountainLengthInGCode = config.FormSizeMMLength; MountainHeightInGCode = config.FormSizeMMHeight; var minorLength = mountainData.Points.Count; var majorLength = mountainData.Points[0].Count; Heights = new decimal[minorLength, majorLength]; for (int i = 0; i < minorLength; i++) { for (int j = 0; j < majorLength; j++) { Heights[i, j] = mountainData.Points[i][j].height; } } }
public JsonResult GetMountainGCode(MountainViewModel mountain) { var service = new MountainService(); var mountainData = new MountainData(); var mData = service.GetMountainData(mountain.id); var processor = new GCodeProcessor(); var gCode = processor.GetMountainGCode(mData.MountainData, new GCodeConfiguration { FormSizeMMHeight = 40, FormSizeMMLength = 70, FormSizeMMWidth = 70, CleanSpinSizeMM = 6 }); ExportGCodeMovesToFile(gCode.PreparationMoves, @"C:\tfs\k2_prep.txt"); ExportGCodeMovesToFile(gCode.DirtyMoves, @"C:\tfs\k2_dirty.txt"); ExportGCodeMovesToFile(gCode.CleanMoves, @"C:\tfs\k2_clean.txt"); return(Json("OK")); }
private void Start() { List <MountainData> currentBatch = new List <MountainData>(); List <Matrix4x4> currentMatrixBatch = new List <Matrix4x4>(); Vector3 leftPosition = Vector3.zero; Vector3 rightPosition = Vector3.zero; for (int i = 0; i < _instances; i++) { leftPosition.z = i * offset; MountainData leftSide = new MountainData(leftPosition, Quaternion.Euler(leftRotation.x, leftRotation.y, leftRotation.z), scale); rightPosition.x = 4f; rightPosition.z = i * offset; MountainData rightSide = new MountainData(rightPosition, Quaternion.Euler(rightRotation.x, rightRotation.y, rightRotation.z), scale); currentBatch.Add(leftSide); currentBatch.Add(rightSide); currentMatrixBatch.Add(leftSide.Matrix); currentMatrixBatch.Add(rightSide.Matrix); if (currentBatch.Count == 1000) { _batches.Add(currentBatch); _matrixBatches.Add(currentMatrixBatch); currentBatch = new List <MountainData>(); currentMatrixBatch = new List <Matrix4x4>(); } } if (!_batches.Contains(currentBatch)) { _batches.Add(currentBatch); _matrixBatches.Add(currentMatrixBatch); } }