Advertisement
xxeell

Untitled

Sep 2nd, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.44 KB | None | 0 0
  1.     public interface IPair
  2.     {
  3.         IPair Clone();
  4.         int GetResult(int[,] img);
  5.     }
  6.  
  7.     public class NumericPair : IPair
  8.     {
  9.         private int x1, y1, x2, y2;
  10.  
  11.         public NumericPair(int ix1, int iy1, int ix2, int iy2)
  12.         {
  13.             x1 = ix1;
  14.             y1 = iy1;
  15.  
  16.             x2 = ix2;
  17.             y2 = iy2;
  18.         }
  19.  
  20.         public int GetResult(int[,] img)
  21.         {
  22.             return (int)Math.Round((img[x1, y1] + img[x2, y2]) / 2.0);
  23.         }
  24.  
  25.         public IPair Clone()
  26.         {
  27.             return new NumericPair(x1, y1, x2, y2);
  28.         }
  29.     }
  30.  
  31.     public class PairPair : IPair
  32.     {
  33.         private IPair n1, n2;
  34.  
  35.         public PairPair(IPair num_1, IPair num_2)
  36.         {
  37.             n1 = num_1;
  38.             n2 = num_2;
  39.         }
  40.  
  41.         public int GetResult(int[,] img)
  42.         {
  43.             return (int)Math.Round((n1.GetResult(img) + n2.GetResult(img)) / 2.0);
  44.         }
  45.  
  46.         public IPair Clone()
  47.         {
  48.             return new PairPair(n1, n2);
  49.         }
  50.     }
  51.  
  52.     public class NullPair : IPair
  53.     {
  54.         public NullPair()
  55.         {
  56.         }
  57.  
  58.         public int GetResult(int[,] img)
  59.         {
  60.             return -1;
  61.         }
  62.  
  63.         public IPair Clone()
  64.         {
  65.             return new NullPair();
  66.         }
  67.     }
  68.  
  69.     public class DeformateInfoCreator
  70.     {
  71.         private bool test(Point[] polygon)
  72.         {
  73.             int min_x = int.MaxValue;
  74.             int max_x = int.MinValue;
  75.             int min_y = int.MaxValue;
  76.             int max_y = int.MinValue;
  77.  
  78.             foreach (Point i in polygon)
  79.             {
  80.                 if (i.X < min_x) min_x = i.X;
  81.                 if (i.X > max_x) max_x = i.X;
  82.                 if (i.Y < min_y) min_y = i.Y;
  83.                 if (i.Y > max_y) max_y = i.Y;
  84.             }
  85.  
  86.             int size_x = max_x - min_x;
  87.             int size_y = max_y - min_y;
  88.  
  89.             if (size_x == 0 || size_y == 0) return false;
  90.             return true;
  91.         }
  92.  
  93.         private IPair[,] primary_pairization(Point[] polygon)
  94.         {
  95.             int min_x = int.MaxValue;
  96.             int max_x = int.MinValue;
  97.             int min_y = int.MaxValue;
  98.             int max_y = int.MinValue;
  99.  
  100.             foreach (Point i in polygon)
  101.             {
  102.                 if (i.X < min_x) min_x = i.X;
  103.                 if (i.X > max_x) max_x = i.X;
  104.                 if (i.Y < min_y) min_y = i.Y;
  105.                 if (i.Y > max_y) max_y = i.Y;
  106.             }
  107.  
  108.             int width = max_x - min_x;
  109.             int height = max_y - min_y;
  110.  
  111.             IPair[,] res = new IPair[width, height];
  112.  
  113.             for (int x = 0; x < width; x++)
  114.             {
  115.                 for (int y = 0; y < height; y++)
  116.                 {
  117.                     res[x, y] = new NumericPair(x, y, x, y);
  118.                 }
  119.             }
  120.  
  121.             return res;
  122.         }
  123.  
  124.         private void left_deformation(int width, int height, IPair[,] img, Point dp, Point tp)
  125.         {
  126.             int delta = Math.Abs(dp.X - tp.X); // Смещение
  127.             if (delta == 0) return;
  128.  
  129.             double part_size = (double)((double)height / (double)delta);
  130.  
  131.             if (dp.X > tp.X)
  132.             {
  133.                 for (int i = 1; i <= delta; i++)
  134.                 {
  135.                     for (int y = (int)(i * part_size); y < height; y++)
  136.                     {
  137.                         for (int x = width - 1; x >= i; x--)
  138.                         {
  139.                             if (!(img[x, y] is NullPair))
  140.                             {
  141.                                 img[x, y] = new PairPair(img[x, y].Clone(), img[x - 1, y].Clone());
  142.                             }
  143.                         }
  144.                         for (int x = i - 1; x >= 0; x--)
  145.                         {
  146.                             img[x, y] = new NullPair();
  147.                         }
  148.                     }
  149.                 }
  150.             }
  151.             else
  152.             {
  153.                 for (int i = 1; i <= delta; i++)
  154.                 {
  155.                     for (int y = (int)(i * part_size); y < height; y++)
  156.                     {
  157.                         for (int x = width - 1; x >= i; x--)
  158.                         {
  159.                             img[x, height - y - 1] = new PairPair(img[x, height - y - 1].Clone(), img[x - 1, height - y - 1].Clone());
  160.                         }
  161.                         for (int x = i - 1; x >= 0; x--)
  162.                         {
  163.                             img[x, height - y - 1] = new NullPair();
  164.                         }
  165.                     }
  166.                 }
  167.             }
  168.         }
  169.  
  170.         private void right_deformation(int width, int height, IPair[,] img, Point dp, Point tp)
  171.         {
  172.             int delta = Math.Abs(dp.X - tp.X); // Смещение
  173.             if (delta == 0) return;
  174.  
  175.             double part_size = (double)((double)height / (double)delta);
  176.  
  177.             if (dp.X < tp.X)
  178.             {
  179.                 for (int i = 1; i <= delta; i++)
  180.                 {
  181.                     for (int y = (int)(i * part_size); y < height; y++)
  182.                     {
  183.                         for (int x = 0; x < width - i; x++)
  184.                         {
  185.                             if (!(img[x, y] is NullPair))
  186.                             {
  187.                                 img[x, y] = new PairPair(img[x, y].Clone(), img[x + 1, y].Clone());
  188.                             }
  189.                         }
  190.                         for (int x = width - i; x < width; x++)
  191.                         {
  192.                             img[x, y] = new NullPair();
  193.                         }
  194.                     }
  195.                 }
  196.             }
  197.             else
  198.             {
  199.                 for (int i = 1; i <= delta; i++)
  200.                 {
  201.                     for (int y = (int)(i * part_size); y < height; y++)
  202.                     {
  203.                         for (int x = 0; x < width - i; x++)
  204.                         {
  205.                             if (!(img[x, height - y - 1] is NullPair))
  206.                             {
  207.                                 img[x, height - y - 1] = new PairPair(img[x, height - y - 1].Clone(), img[x + 1, height - y - 1].Clone());
  208.                             }
  209.                         }
  210.                         for (int x = width - i; x < width; x++)
  211.                         {
  212.                             img[x, height - y - 1] = new NullPair();
  213.                         }
  214.                     }
  215.                 }
  216.             }
  217.         }
  218.  
  219.         private void top_deformation(int width, int height, IPair[,] img, Point lp, Point rp)
  220.         {
  221.             int delta = Math.Abs(lp.Y - rp.Y); // Смещение
  222.             if (delta == 0) return;
  223.  
  224.             double part_size = (double)((double)width / (double)delta);
  225.  
  226.             if (lp.Y < rp.Y)
  227.             {
  228.                 for (int i = 1; i <= delta; i++)
  229.                 {
  230.                     for (int x = (int)(i * part_size); x < width; x++)
  231.                     {
  232.                         for (int y = height - 1; y >= i; y--)
  233.                         {
  234.                             if (!(img[x, y] is NullPair))
  235.                             {
  236.                                 img[x, y] = new PairPair(img[x, y].Clone(), img[x, y - 1].Clone());
  237.                             }
  238.                         }
  239.                         for (int y = i; y >= 0; y--)
  240.                         {
  241.                             img[x, y] = new NullPair();
  242.                         }
  243.                     }
  244.                 }
  245.             }
  246.             else
  247.             {
  248.                 for (int i = 1; i <= delta; i++)
  249.                 {
  250.                     for (int x = (int)(i * part_size); x < width; x++)
  251.                     {
  252.                         for (int y = height - 1; y >= i; y--)
  253.                         {
  254.                             if (!(img[width - x - 1, y] is NullPair))
  255.                             {
  256.                                 img[width - x - 1, y] = new PairPair(img[width - x - 1, y].Clone(), img[width - x - 1, y - 1].Clone());
  257.                             }
  258.                         }
  259.                         for (int y = i; y >= 0; y--)
  260.                         {
  261.                             img[width - x - 1, y] = new NullPair();
  262.                         }
  263.                     }
  264.                 }
  265.             }
  266.         }
  267.  
  268.         private void down_deformation(int width, int height, IPair[,] img, Point lp, Point rp)
  269.         {
  270.             int delta = Math.Abs(lp.Y - rp.Y); // Смещение
  271.             if (delta == 0) return;
  272.  
  273.             double part_size = (double)((double)width / (double)delta);
  274.  
  275.             if (lp.Y > rp.Y)
  276.             {
  277.                 for (int i = 1; i <= delta; i++)
  278.                 {
  279.                     for (int x = (int)(i * part_size); x < width; x++)
  280.                     {
  281.                         for (int y = 0; y < height - i; y++)
  282.                         {
  283.                             if (!(img[x, y] is NullPair))
  284.                             {
  285.                                 img[x, y] = new PairPair(img[x, y].Clone(), img[x, y + 1].Clone());
  286.                             }
  287.                         }
  288.                         for (int y = height - i; y < height; y++)
  289.                         {
  290.                             img[x, y] = new NullPair();
  291.                         }
  292.                     }
  293.                 }
  294.             }
  295.             else
  296.             {
  297.                 for (int i = 1; i <= delta; i++)
  298.                 {
  299.                     for (int x = (int)(i * part_size); x < width; x++)
  300.                     {
  301.                         for (int y = 0; y < height - i; y++)
  302.                         {
  303.                             if (!(img[width - x - 1, y] is NullPair))
  304.                             {
  305.                                 img[width - x - 1, y] = new PairPair(img[width - x - 1, y].Clone(), img[width - x - 1, y + 1].Clone());
  306.                             }
  307.                         }
  308.                         for (int y = height - i; y < height; y++)
  309.                         {
  310.                             img[width - x - 1, y] = new NullPair();
  311.                         }
  312.                     }
  313.                 }
  314.             }
  315.         }
  316.  
  317.         public IPair[,] GetDeformInfo(Point[] polygon)
  318.         {
  319.             if (!test(polygon)) return null;
  320.  
  321.             IPair[,] res = primary_pairization(polygon);
  322.  
  323.             int width = res.GetLength(0);
  324.             int height = res.GetLength(1);
  325.  
  326.             left_deformation(width, height, res, polygon[0], polygon[1]);
  327.             right_deformation(width, height, res, polygon[3], polygon[2]);
  328.             top_deformation(width, height, res, polygon[1], polygon[2]);
  329.             down_deformation(width, height, res, polygon[0], polygon[3]);
  330.  
  331.             return res;
  332.         }
  333.     }
  334.  
  335. public class TextureDeformator
  336.     {
  337.         private bool test(Point[] polygon)
  338.         {
  339.             int min_x = int.MaxValue;
  340.             int max_x = int.MinValue;
  341.             int min_y = int.MaxValue;
  342.             int max_y = int.MinValue;
  343.  
  344.             foreach (Point i in polygon)
  345.             {
  346.                 if (i.X < min_x) min_x = i.X;
  347.                 if (i.X > max_x) max_x = i.X;
  348.                 if (i.Y < min_y) min_y = i.Y;
  349.                 if (i.Y > max_y) max_y = i.Y;
  350.             }
  351.  
  352.             int size_x = max_x - min_x;
  353.             int size_y = max_y - min_y;
  354.  
  355.             if (size_x == 0 || size_y == 0) return false;
  356.             return true;
  357.         }
  358.  
  359.         private Bitmap primary_fitting(Bitmap texture, Point[] polygon)
  360.         {
  361.             int min_x = int.MaxValue;
  362.             int max_x = int.MinValue;
  363.             int min_y = int.MaxValue;
  364.             int max_y = int.MinValue;
  365.  
  366.             foreach (Point i in polygon)
  367.             {
  368.                 if (i.X < min_x) min_x = i.X;
  369.                 if (i.X > max_x) max_x = i.X;
  370.                 if (i.Y < min_y) min_y = i.Y;
  371.                 if (i.Y > max_y) max_y = i.Y;
  372.             }
  373.  
  374.             int size_x = max_x - min_x;
  375.             int size_y = max_y - min_y;
  376.  
  377.             Bitmap res = new Bitmap(size_x, size_y);
  378.  
  379.             using (Graphics g = Graphics.FromImage(res))
  380.             {
  381.                 g.DrawImage(texture, 0, 0, size_x, size_y);
  382.             }
  383.  
  384.             return res;
  385.         }
  386.  
  387.         private byte color_to_byte(Color color)
  388.         {
  389.             byte r = color.R;
  390.             byte g = color.G;
  391.             byte b = color.B;
  392.  
  393.             return (byte)((r + g + b) / 3);
  394.         }
  395.  
  396.         private int[,] primary_digitization(Bitmap texture)
  397.         {
  398.             int w = texture.Width;
  399.             int h = texture.Height;
  400.  
  401.             int[,] res = new int[w, h];
  402.             Color c;
  403.  
  404.             for (int x = 0; x < w; x++)
  405.             {
  406.                 for (int y = 0; y < h; y++)
  407.                 {
  408.                     c = texture.GetPixel(x, y);
  409.                     res[x, y] = color_to_byte(c);
  410.                 }
  411.             }
  412.  
  413.             return res;
  414.         }
  415.  
  416.         private Bitmap final_draw(int width, int height, int[,] img)
  417.         {
  418.             Bitmap res = new Bitmap(width, height);
  419.  
  420.             for (int x = 0; x < width; x++)
  421.             {
  422.                 for (int y = 0; y < height; y++)
  423.                 {
  424.                     if (img[x, y] < 0) res.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
  425.                     else res.SetPixel(x, y, Color.FromArgb(img[x, y], img[x, y], img[x, y]));
  426.                 }
  427.             }
  428.  
  429.             return res;
  430.         }
  431.  
  432.         private int[,] deformation_with_info(int[,] img, IPair[,] info)
  433.         {
  434.             int w = img.GetLength(0);
  435.             int h = img.GetLength(1);
  436.  
  437.             int[,] res = new int[w, h];
  438.  
  439.             for (int x = 0; x < w; x++)
  440.             {
  441.                 for (int y = 0; y < h; y++)
  442.                 {
  443.                     res[x, y] = info[x, y].GetResult(img);
  444.                 }
  445.             }
  446.  
  447.             return res;
  448.         }
  449.  
  450.         public Bitmap Deformate(Bitmap texture, Point[] polygon, IPair[,] deform_info)
  451.         {
  452.             if (!test(polygon)) return new Bitmap(1, 1);
  453.             if (deform_info == null) return new Bitmap(1, 1);
  454.  
  455.             Bitmap res = primary_fitting(texture, polygon);
  456.             int[,] img = primary_digitization(res);
  457.  
  458.             img = deformation_with_info(img, deform_info);
  459.  
  460.             res = final_draw(res.Width, res.Height, img);
  461.  
  462.             return res;
  463.         }
  464.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement