/// <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;
        }
示例#3
0
 /// <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;
 }