Бінарні дерева і фракали

Бінарне дерево може також виступати у ролі конструктивного фрактала. Він будується за наступним прин

Бінарне дерево може також виступати у ролі конструктивного фрактала. Він будується за наступним принципом: на кожному рівні вертикальна лінія розділяється на дві з деяким показником зменшення. Такі розгалужені фрактали називаються дендритами (в перекладі з грецької « δένδρον» — дерево).

Код для побудови такого фракталу:

private void DrawTTree(int x, int y, int lenght, int level)
        {
            if (lenght < 4) return;
            var l = lenght / 2;
            var pen = new Pen(Colors[level % 5], (5-level)>1?(5-level):1);
            _graphics.DrawLine(pen,x, y, x, y - l);
            _graphics.DrawLine(pen,x, y - l, x - l, y - l);
            _graphics.DrawLine(pen,x, y - l, x + l, y - l);
            DrawTTree(x - l, y - l, l, level + 1);
            DrawTTree(x + l, y - l, l, level + 1);
        }
Існують і інші подання двійкового дерева: H-дерево і V-дерево.
 
H-дерево будується наступним чином: беремо одиничний відрізок, і на першому кроці два коротших відрізка поміщаємо перпендикулярно кінцях початкового так, щоб утворилася буква H, повторюємо дії.

 

Код для побудови такого фракталу:

 {            
            if (lenght < 20) return; 
            var l = lenght/2;            
            int x1=centerX-l, x2=centerX+l, y1=centerY-l/2, y2=centerY+l/2;
            var pen = new Pen(Colors[level], 4-level/2);            
            _graphics.DrawLine(pen, x1, centerY, x2, centerY);
            _graphics.DrawLine(pen, x1, y1, x1, y2);
            _graphics.DrawLine(pen, x2, y1, x2, y2);          
            DrawHTree(x1, y1, l, level + 1);
            DrawHTree(x1, y2, l, level + 1);
            DrawHTree(x2, y1, l, level + 1);
            DrawHTree(x2, y2, l, level + 1);
        }

 

V-дерево будується аналогічно:

 private static void DrawVTree(int centerX, int centerY, int lenght, int level)
{
            if (lenght < 2) return;
            var delta= Convert.ToInt32(lenght * Math.Sqrt(2)/2.0);
            var x1 = centerX - delta;
            var x2 = centerX + delta;
            var y = centerY - delta;
            var pen = new Pen(Colors[level%5], 2);
            _graphics.DrawLine(pen, centerX, centerY, x1, y );
            _graphics.DrawLine(pen, centerX, centerY, x2, y );
            DrawVTree(x1, y, 2*delta/3, level + 1);
            DrawVTree(x2, y, 2*delta/3, level + 1);            
}

 

Клас для роботи з Yandex Translate API

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using WindowsFormsApplication2.Properties;
 
namespace WindowsFormsApplication2
{
    public  class YandexTranslate
    {
        private readonly string _apiKey;
 
        public YandexTranslate()
        {
            _apiKey = Settings.Default.ApiKey;
        }
 
        public YandexTranslate(string key)
        {
            _apiKey = key;
        }
 
        public  List<string> GetLangs()
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/getLangs?key={0}",
                _apiKey);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse(); 
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(GetLangsData));
            var getLangsData = (GetLangsData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            return getLangsData.Dirs;
        }
        public  List<string> GetLangs(string ui)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/getLangs?key={0}&ui={1}",
                _apiKey, ui);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse();
            var sr = new StreamReader(response.GetResponseStream());
            var json = sr.ReadToEnd();
            json = json.Remove(json.Length - 3);
            json = json.Substring(json.IndexOf("langs") + 8);
            json = json.Replace('"', ' ');            
            return json.Split(',').ToList();
        }
        public  string Detect(string text)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/detect?key={0}&text={1}",
                _apiKey, text);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse();
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(DetectData));
            var detectData = (DetectData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            return detectData.Lang;
        }
        public  List<string> Translate(string lang, string text)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/translate?key={0}&text={1}&lang={2}&format={3}",
                _apiKey, text, lang, "plain");
 
            var request = WebRequest.Create(requestString);
            if ((requestString.Length > 10240) && (request.Method.StartsWith("GET")))
                throw new ArgumentException("Text is too long (>10Kb)");
            var response = request.GetResponse();
 
            TranslateData translateData;
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(TranslateData));
            try
            {
                translateData = (TranslateData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            }
            catch (Exception exception)
            {
                translateData = new TranslateData();
                translateData.Text = new List<string>();
            }
            return translateData.Text;
        }
        [DataContract]
        internal class TranslateData
        {
            [DataMember (Name = "code")]
            internal int Code { get; set; }            
            [DataMember(Name = "lang")]
            internal string Lang { get; set; }
            [DataMember(Name = "text")]
            internal List<string> Text { get; set; }
        }
        [DataContract]
        public class GetLangsData
        {
            [DataMember(Name = "dirs")]
            internal List<string> Dirs { get; set; }
        }
        [DataContract]
        internal class DetectData
        {
            [DataMember(Name = "code")]
            internal int Code { get; set; }            
            [DataMember(Name = "lang")]
            internal string Lang { get; set; }
        }
    }
}

 

Як серіалізувати ArrayList у C#

Наведу приклад серіалізації колекції ArrayList з власних елементів MyElementClass: using Syste

Наведу приклад серіалізації колекції ArrayList з власних елементів MyElementClass:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml.Serialization;
using System.IO; 

namespace ConsoleApplication1
{
 class Program
 {
   static void Main(string[] args)
   {
     ArrayList al = new ArrayList();
     XmlSerializer serializer=new XmlSerializer(typeof(ArrayList),new Type[] {typeof (MyElementClass )});
     al.Add(new MyElementClass());
     al.Add (new MyElementClass (2,"AAA"));
     Console.WriteLine("Writing With Stream"); 
     try
     {
        Stream writer = new FileStream("C:\A.XML", FileMode.Create);
        serializer.Serialize(writer, al);
        writer.Close();
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message );
      }
  }
} 

Нижче подано код для елемента

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; 

namespace ConsoleApplication1
{
  public class MyElementClass: IComparable 
  {
    public int ID;
    public string Name;
    public MyElementClass()
    {
      ID = 1;
      Name = "ABC";
    }
    public MyElementClass(int id, string name)
    {
      ID = id;
      Name = name;
    }
    public int CompareTo(object obj)
    {
       if (obj is MyElementClass)
        {
           MyElementClass otherElement = (MyElementClass)obj;
           return this.ID.CompareTo (otherElement.ID);
        }
       else
        {
          throw new ArgumentException("object is not a MyElement");
        }
   }
 }
}