/// <summary> /// 使用指定的拼图形状初始化 <see cref="JigsawPieceCollection"/> 类的新实例。 /// </summary> /// <param name="shape">拼图形状。</param> public JigsawPieceCollection(Factory factory, JigsawShape shape) { if (factory == null) { throw CommonExceptions.ArgumentNull("factory"); } if (shape == null) { throw CommonExceptions.ArgumentNull("shape"); } InitializePieces(factory, shape); }
/// <summary> /// 初始化拼图碎片列表。 /// </summary> /// <param name="factory">Direct2D 工厂。</param> /// <param name="shape">拼图形状。</param> private void InitializePieces(Factory factory, JigsawShape shape) { shape.GererateJigsawShape(); JigsawPiece[] pieces = new JigsawPiece[shape.HorizontalDimension]; JigsawPiece lastPiece = null; int idx = 0; for (int i = 0; i < shape.VerticalDimension; i++) { for (int j = 0; j < shape.HorizontalDimension; j++, idx++) { if (i == 0) { JigsawPiece currentPiece = new JigsawPiece(factory, shape.Paths[idx], JigsawPieceType.Border); items.Add(currentPiece); if (j == 0) { front = lastPiece = pieces[j] = currentPiece; } else { pieces[j] = currentPiece; currentPiece.Neighbors.Add(lastPiece); lastPiece.Neighbors.Add(currentPiece); currentPiece.Prev = lastPiece; lastPiece.Next = currentPiece; lastPiece = currentPiece; } } else { JigsawPieceType type = JigsawPieceType.Normal; if (j == 0 || i == shape.VerticalDimension - 1 || j == shape.HorizontalDimension - 1) { type = JigsawPieceType.Border; } JigsawPiece currentPiece = new JigsawPiece(factory, shape.Paths[idx], type); items.Add(currentPiece); if (j != 0) { currentPiece.Neighbors.Add(lastPiece); lastPiece.Neighbors.Add(currentPiece); } currentPiece.Prev = lastPiece; lastPiece.Next = currentPiece; currentPiece.Neighbors.Add(pieces[j]); pieces[j].Neighbors.Add(currentPiece); lastPiece = pieces[j] = currentPiece; } } } back = lastPiece; }
/// <summary> /// 确定按钮按下的事件。 /// </summary> private void btnOK_Click(object sender, EventArgs e) { JigsawSetting.Default.Shape = combShape.SelectedIndex; JigsawSetting.Default.Anchor = info.AnchorToBackground = cbxAnchor.Checked; info.AnchorRadius = 5f; using (MemoryStream stream = new MemoryStream()) { image.Save(stream, ImageFormat.Png); stream.Seek(0, SeekOrigin.Begin); info.ImageData = stream.ToArray(); } info.Scale = 1f; info.PieceSum = horizontalDimension * verticalDimension; JigsawSetting.Default.Rotatable = info.Rotatable = cbxRotate.Checked; shape = JigsawShape.CreateShape((JigsawShapeType)combShape.SelectedValue); shape.HorizontalDimension = horizontalDimension; shape.VerticalDimension = verticalDimension; JigsawSetting.Default.Randomization = shape.Randomization = (float)tbarRand.Value / 100; shape.Size = new SharpDX.Size2F(image.Width, image.Height); this.DialogResult = DialogResult.OK; }