Enlem ve Boylam Koordinatlarının x ve y Pixel Dönüşümü ve Harita Ölçeklendirmesi

Selamün Aleyküm Arkadaşlar,

Koordinatları verilmiş bir çokgenin çizimi nasıl yapılır bunu inceleyeceğiz.

polygon

 

Çokgen Enlem ve Boylam

Index Boylam (Longitude) Enlem (Latitude)
0 -142.734375 -44.087585
1 -129.726563 -40.313043
2 -117.246094 -45.460131
3 -110.742188 -53.225768
4 -117.070313 -59.800634
5 -132.011719 -64.168107
6 -148.535156 -59.888937
7 -154.335938 -53.014783
8 -142.734375 -44.087585

 

Tablodan enlem ve boylam için maksimum ve minimum değerlerini bulalım.

Boylam max: -110.742188

Boylam min: -154.335938

Enlem max: -40.313043

Enlem min: -64.168107

cizim5

Bu enlem ve boylam değerlerinin x ve y koordinatlarına çevirmemiz gerekir. Bunun için Merkator Projeksiyonundan (Mercator Projection) yararlanırız. Bu projeksiyon bize dünyanın bir dikdörtgen olarak harita açılımını verir. İlk önce enlem ve boylam radyan cinsine çevrilir.

Enlem = Enlem * pi / 180
Boylam = Boylam * pi / 180

Enlem = ln(tan(pi/4 + Enlem/2))

x = Boylam
y = Enlem

C#

public PointF getlatlong2xy (double longitude, double latitude) {
          var radians = Math.PI / 180;
          longitude = longitude * radians;
          latitude = latitude * radians;

          return new PointF(Convert.ToSingle(longitude), Convert.ToSingle(Math.Log(Math.Tan(Math.PI / 4 + 0.5 * latitude))));
        }

Merkator Projeksiyonuna çevirdiğimiz zaman:

PointF min = getlatlong2xy(-154.335938, -64.168107);
PointF max = getlatlong2xy(-110.742188, -40.313043);

 

maxmin

Enlem ve boylamları x ve y koordinatlara çevirelim:

Index X Y
0 -2.49118471 -0.859029233
1 -2.26415563 -0.770058334
2 -2.04633045 -0.892776847
3 -1.93281579 -1.10139823
4 -2.04326248 -1.31001961
5 -2.30403924 -1.47262156
6 -2.59242749 -1.31308758
7 -2.69367027 -1.09526229
8  -2.49118471 -0.859029233

 

Çizim Alanımız:

cizim

Çizim alanımızla çokgenin boyutlarının oranını bulmamız gerekir. İlk önce çizim alanımızdan 10px lik boşluk bırakalım. Genişlikten sağ ve sol olmak üzere 10px boşluk bıraktığımızda genişlik = genişlik – 20. Aynı şekilde yükseklik = yükseklik – 20. Yeni çizim alanımız 562×353

Şimdi ise Çokgenin x ve y deki boyutunu bulalım.

Xboyut = Xmax – Xmin

Yboyut = Ymax – Xmin

cizim5

genislikoran = 562 / Xboyut

yukseklikoran = 353 / Yboyut

Hangi oran daha düşükse o oran bizim genel oranımız olur.

genislikoran = 738.6432

yukseklikoran = 502.4459

geneloran = 502.4459

Genişlik ve Yükseklik boşluklarını bulalım.

Yukseklikbosluk = (373 – (Yboyut * geneloran)) / 2

Genislikbosluk = (582 – (Xboyut * geneloran)) / 2


cizim1

X ve Y koordinatlarımızı çizim için başlangıç durumuna getirelim.

X = X – Xmin

Y = Y – Ymin

Index X – Xmin Y – Ymin
0 0.202485561 0.6135923
1 0.429514647 0.7025632/td>
2 0.6473398 0.5798447
3 0.7608545 0.37122333
4 0.6504078 0.162601948
5 0.389631033 0.0
6 0.101242781 0.159533978
7 0.0 0.377359271
8 0.202485561 0.6135923

 

X ve Y koordinatlarını çizim alanına göre ölçekleyelim.

X = Genislikbosluk + (X * geneloran)

Y koordinatı 0,0 dan başlayacağı için tersine çevirelim.

Y = 373 – Yukseklikbosluk – (Y * geneloran)

Index X Y
0 201.593933 54.703064
1 315.663757 10.0
2 425.109131 71.65941
3 482.1441 176.480362
4 426.6506 281.301331
5 295.62442 363.0
6 150.724915 282.8428
7 99.855896 173.397385
8 201.593933 54.703064

 

cizim5

C#

public PointF getlatlong2xy (double longitude, double latitude) {
          var radians = Math.PI / 180;
          longitude = longitude * radians;
          latitude = latitude * radians;

          return new PointF(Convert.ToSingle(longitude), Convert.ToSingle(Math.Log(Math.Tan(Math.PI / 4 + 0.5 * latitude))));
}

public Image getImage(PointF[] points, int width, int height, int padding = 10)
        {
            if (points.Length == 0)
                return null;

            Image img = new Bitmap(width, height);

            PointF min = new PointF(points[0].X, points[0].Y);
            PointF max = new PointF(points[0].X, points[0].Y);

            foreach (PointF p in points)
            {
                min.X = (p.X < min.X) ? p.X : min.X;
                min.Y = (p.Y < min.Y) ? p.Y : min.Y;

                max.X = (p.X > max.X) ? p.X : max.X;
                max.Y = (p.Y > max.Y) ? p.Y : max.Y;
            }

            min = getlatlong2xy(min.X, min.Y);
            max = getlatlong2xy(max.X, max.Y);

            PointF XYlength = new PointF(max.X - min.X, max.Y - min.Y);

            int mapWidth = img.Width - padding * 2;
            int mapHeight = img.Height - padding * 2;

            float widthRatio = mapWidth / XYlength.X;
            float heightRatio = mapHeight / XYlength.Y;

            float globalRatio = Math.Min(widthRatio, heightRatio);

            int widthPadding = Convert.ToInt32((width - (XYlength.X * globalRatio)) / 2);
            int heightPadding = Convert.ToInt32((height - (XYlength.Y * globalRatio)) / 2);

            List<PointF> dpoints = new List<PointF>();

            foreach (PointF p in points)
            {
                PointF p1 = getlatlong2xy(p.X, p.Y);
                p1.X -= min.X;
                p1.Y -= min.Y;

                float x = widthPadding + p1.X * globalRatio;
                float y = img.Height - heightPadding - (p1.Y * globalRatio);

                dpoints.Add(new PointF(x, y));
            }

            Graphics g = Graphics.FromImage(img);
            g.FillPolygon(Brushes.Blue, dpoints.ToArray(), System.Drawing.Drawing2D.FillMode.Alternate);

            return img;
        }

 

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

C# using Kullanımı

Merhaba Arkadaşlar;

Uzun bir aradan sonra blogumda yazmaya başlıyorum. Bugün C# using kullanımına, nasıl kullanıldığına ve niçin kullanıldığına bir göz atalım.

C# ‘ta using kullanımı; using directive ve using statement olarak ikiye ayrılır.

USING DIRECTIVE (USING BİLDİRİMİ)

Namespace’leri dahil ettiğimiz ismini yazmadan içinde bulunan sınıfları (class) kullandığımız yapıdır. Namespace dışında en üstte şu şekilde tanımlanır: using namespaceadi;

using System;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();
        }
    }
}

List sınıfı (class) System.Collections.Generic isim uzayının (namespace) içinde yer alır. using ile dahil etmediğimiz için namespace adını da yazarak çağırmak durumunda kaldık.

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
        }
    }
}

Burada ise System.Collections.Generic isim uzayını dahil ettiğimizden dolayı sadece içinde bulunan List sınıfını çağırarak kullandık.

Aynı zamanda using bildirimi ile dahil ettiğimiz namespace ve namespace içindeki sınıfları adlandırmak içinde kullanılır.

using System;
using Liste = System.Collections.Generic.List<int>;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Liste list = new Liste();
        }
    }
}

Burada System.Collections.Generic.List<int> sınıfını Liste olarak adlandırdık ve bu yüzden o isimle kullandık.

USING STATEMENT (USING İFADESİ)

Bir sınıf kullanıldıktan sonra, çöp toplayıcından (Garbage Collector) önce; IDisposable arayüzünün (interface) Dispose metodunun çalıştırılarak hafızadan (memory) silinmesi işlemidir.

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection con = new SqlConnection()){
                //con kullan
            }
        }
    }
}

Kullanımı bu şekildedir. Sınıf {} içinde kullanılmalıdır.

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection(); //Bu kullanım tavsiye edilmez
            using (con){
                //con kullan
            }
        }
    }
}

Bu şekilde kullanımı tavsiye edilmez.

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
//Birden fazla değişkenle kullanabilirsiniz
            using (SqlConnection con = new SqlConnection(), con2 = new SqlConnection()) { 
                //con ve con2 kullan
            }
        }
    }
}

Birden fazla değişkenle kullanabilirsiniz.

using ifadesi aslında şu kodun kısa halidir.

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

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection();

            try
            {
                //Kodlar
            }
            finally
            {
                if (con != null)
                    ((IDisposable)con).Dispose();
            }
        }
    }
}

Not: using ifadesinin kullanıldığı sınıflar IDisposable arayüzü (interface) içermek zorundadır.

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

HDD MBR Structure (Yapısı)

MBR (Master Boot Record)

MBR harddiskin ilk dilimidir(sector). Tabloların bilgilerini ve önyükleme işletim sistemlerinin tanımlandığı bölümdür. Boyutu 512 Byte’dır. Byte’lar Little Endian olarak saklanır.

SnapCrab_NoName_2015-2-18_22-21-35_No-00

1) Bootstrap Code Area (Önyükleme Kod Alanı)

Bilgisayar açıldığı zaman; BIOS’un okuyup çalıştıracağı kodları barındırır. Bu kod BIOS tarafından çalıştırıldıktan sonra işletim sistemine giriş yapılır. Boyutu 446 Byte’dır.

2) Primary Partition Tables (Birincil Bölüm Tabloları)

Birincil bölüm bilgilerinin tutulduğu bölgedir. Minimum 1 birincil bölüm, maksimum 4 birincil bölüm tutulabilir. Boyutu 64 Byte’dır.

SnapCrab_NoName_2015-2-18_22-21-53_No-00

a) Partition Entry (Bölüm Kaydı)

Bölümün durumunu, başlangıç adresini, toplam sector sayısını ve bölümün dosya sistemini tutar. Boyutu 16 Byte’dır.

SnapCrab_NoName_2015-2-18_21-15-28_No-00

Partition Type ID listesi için tıklayınız.

3) Boot Signature

MBR imza byte’larıdır.

SnapCrab_NoName_2015-2-18_22-13-19_No-00

 

SnapCrab_NoName_2015-2-18_22-39-51_No-00
SnapCrab_NoName_2015-2-18_22-55-12_No-00

 

 

 

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

Regular Expressions (Düzenli İfadeler)

Adından da anlaşıldığı üzere bir metnin içindeki verinin, belli kurallara göre değiştirilmesi veya bulunması işlemidir.

Test için http://www.regexr.com/ adresini kullanabilirsiniz.

Dot Matches (Nokta Eşleşmeleri)

. herhangi bir karakteri temsil eder. /./ ifadesini uyguladığımızda metindeki tüm veriyi seçer.

SnapCrab_No-0006

Herhangi bir veriyi veya verileri seçmek istiyorsak eğer

SnapCrab_No-0007

Optional (?)

Bir karakteri veya karakterleri isteğe bağlı olarak var veya yok sayar.

Örneğin bir metinde “color” kelimesini aradığımızda aynı zamanda, aynı manada olan “colour” kelimesini de aramamız gerekir.  u karakterinin isteğe bağlı olması gerekir.

SnapCrab_No-0008

 

Birden fazla karakter isteğe bağlı olduğu zaman ()?  parantezin içine yazılır.

SnapCrab_No-0009

Character Set [A-Za-z0-9]

Bize karakter tanım aralığı sunar. [0-9], [1-5], [a-z], [A-Z], [@_#], [İÜ] vs.

SnapCrab_No-0011

SnapCrab_No-0012SnapCrab_No-0013 SnapCrab_No-0014

 

Multiple * +

* karakterin veya karakterlerin hiç olmaması veya tekrarlanmasıdır. Örneğin e*

+ karakterin veya karakterlerin 1 defa olması veya tekrarlamasıdır. Örneğin e+

SnapCrab_No-0015 SnapCrab_No-0016

 

Quanfiers {}

Belli bir aralıkta karakterin veya karakterlerin devam etmesidir. Örnek e{1}, [a-z]{5} vs.

SnapCrab_No-0021 SnapCrab_No-0022 SnapCrab_No-0023

Alternations |

Birkaç hecenin (karakterlerin) veya işlemine tabi tutulmasıdır.

SnapCrab_No-0017SnapCrab_No-0018

 

Anchors & Flags

^ Satır başını temsil eder.

$ Satır sonunu temsil eder.

Flags

i: ignore case (küçük-büyük harf duyarsız)

g: global

m: multiline (birden çok satır)

SnapCrab_No-0024

Groups ()

Grupların yakalanması (bulunması) işlemidir.

SnapCrab_No-0019

 

1. parantez $1, 2. parantez $2 dir. Biz adresleri alacağımız için bu parantezleri iptal edip (?:) metnin tamamını parantez içine alırız.

SnapCrab_No-0020

 

PHP Kullanım

<?php

$regex = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4}/';

$string = 'ibasoglu@example.com';

if(preg_match($regex, $string)){
	echo 'Bu e-mail adresidir.';
}else{
	echo 'Bu e-mail adresi değildir.';
}

//Çıktı: Bu e-mail adresidir.
?>

 

JavaScript Kullanım

var regex = new RegExp('[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4}', 'g');
var string = 'ibasoglu@example.com';

if(regex.exec(string)){
    console.log('Bu e-mail adresidir.');
}else
    console.log('Bu e-mail adresi değildir.');

//Çıktı: Bu e-mail adresidir.

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

TCMB Kurlar

Class

<?php
/*
	Class: TCMBKur
	Author: ibasoglu
	Website: http://www.ibasoglu.com
	Date: 27.01.2015
*/

class TCMBKur{
	private $URL = 'http://www.tcmb.gov.tr/kurlar/today.xml';
	private $kur = array();
	public $tarih = '';
	public $bulten_no = '';

	public function TCMBKur(){
		$xml = simplexml_load_file($this->URL);
		
		$this->tarih = (string) $xml->attributes()->Tarih;
		$this->bulten_no = (string) $xml->attributes()->Bulten_No;

		foreach ($xml->Currency as $d) {
			$this->kur[(string)$d->attributes()->Kod] = array(
				'Isim' 	=> (string) $d->Isim,
				'DA'	=> (float) $d->ForexBuying,
				'DS'	=> (float) $d->ForexSelling,
				'EA'	=> (float) $d->BanknoteBuying,
				'ES'	=> (float) $d->BanknoteSelling
			);
		}
	}

	public function Convert($de = array()){
		$results = array();

		foreach ($de as $d) {

				$kur = $this->kur[$d[0]];

				$results[] = array(
					'dkod' 	=> $d[0] . '/TRY',
					'birim'	=> $d[1],
					'dcins'	=> $kur['Isim'],
					'DA' 	=> $kur['DA'] * $d[1],
					'DS'	=> $kur['DS'] * $d[1],
					'EA' 	=> $kur['EA'] * $d[1],
					'ES' 	=> $kur['ES'] * $d[1]
				);
		}

		return $results;
	}
}

 

Kullanımı

<html>
	<head>
		<meta charset="utf-8">
	</head>
	<body>
		<table border="1" style="border:1px">
			<thead>
				<tr>
					<th>Döviz Kod</th>
					<th>Birim</th>
					<th>Döviz Cinsi</th>
					<th>Döviz Alış</th>
					<th>Döviz Satış</th>
					<th>Efektif Alış</th>
					<th>Efektif Satış</th>
				</tr>
			</thead>
			<tbody>

<?php
require 'TCMBKur.class.php';

$TCMB = new TCMBKur();

$d = array(
	array('USD', 1.00),
	array('AUD', 1.00),
	array('DKK', 1.00),
	array('USD', 1.00),
	array('EUR', 1.00),
	array('GBP', 1.00),
	array('CHF', 1.00),
	array('SEK', 1.00),
	array('CAD', 1.00),
	array('KWD', 1.00),
	array('NOK', 1.00),
	array('SAR', 1.00),
	array('JPY', 1.00),
	array('BGN', 1.00),
	array('RON', 1.00),
	array('RUB', 1.00),
	array('IRR', 1.00),
	array('CNY', 1.00),
	array('PKR', 1.00)
);

$r = $TCMB->Convert($d);

foreach ($r as $de) {
	echo "<tr>
			<td>{$de['dkod']}</td>
			<td>{$de['birim']}</td>
			<td>{$de['dcins']}</td>
			<td>{$de['DA']}</td>
			<td>{$de['DS']}</td>
			<td>{$de['EA']}</td>
			<td>{$de['ES']}</td>
		</tr>";
}

echo "</tbod>
	<tfoot>
		<tr>
			<td colspan=\"7\">Tarih: {$TCMB->tarih}  Bülten No: {$TCMB->bulten_no}</td>
		</tr>
	</tfoot>"
?>

		</table>
	</body>
</html>

SnapCrab_No-0005

WordPress Bakım Hatası ve Çözümü

Eklenti veya WordPress programını güncellerken, işlem sona ermeden sayfa kapandığında sitenin anasayfasına veya admin sayfasına girdiğimiz zaman; ekranda “Zamanlanmış bakım dolayısıyla site uygun değil. Bir kaç dakika içinde tekrar kontrol edin.” yazısını görürüz. Güncelleştirme işlemi yarım kaldığı için bakım modundan çıkılamamıştır.

Çözüm: FTP’den WordPress dosyalarının bulunduğu klasöre girin. Oradan .maintenance dosyasını bulun ve silin. Sonra WordPress yönetim paneline girip güncelleme işlemlerini tekrardan yapabilirsiniz.

SingleTon Pattern Design (Tek Görüntülü Nesneler)

SingleTon bir nesnenin tek bir görüntüsünün (instance) oluşturulup public olarak kullanılmasıdır.

Örneğin bir db adında sınıfımız (class) olsun. Bunu program başında bir kere türetip kullanmamız performans bakımından yararlıdır.

Bunu statik (static) metodlarla yapabiliriz. Sınıfımızı tutabilmek için statik bir değişken tanımlayalım.

public class DB
{
    public static DB obje = null;
}

Şimdi de bir statik metod tanımlayalım. Geriye nesnenin görüntüsü (instance) oluşmuşsa nesneyi, oluşmamışsa oluşturup nesneyi gönderelim.

    public class DB
    {
        public static DB obje = null;

        public static DB getObje() 
        {
            if (obje == null)
                return obje = new DB();

            return obje;
        }
    }

Bunun testini göstermek içinde yapıcı (construct) bir metod yazalım. Rasgele bir sayı üretip değişkende tutalım.

    public class DB
    {
        public static DB obje = null;

        public int rndSayi = 0;

        public static DB getObje() 
        {
            if (obje == null)
                return obje = new DB();

            return obje;
        }

        public DB() {
            Random rnd = new Random();
            rndSayi = rnd.Next();
        }
    }

Şimdi de iki ayrı değişkende nesnenin tek bir kere görüntüsünün oluştuğunu test edelim. Normal olarak görüntüsünü alalım.

        static void Main(string[] args)
        {
            DB nesne1 = new DB();

            //Rastgele ikinci sayının farklı olması için 100 ms bekle
            Thread.Sleep(100);

            DB nesne2 = new DB();

            Console.WriteLine(nesne1.rndSayi);
            Console.WriteLine(nesne2.rndSayi);

            Console.ReadKey();
        }

Farklı iki sayı üretilecektir.

Şimdi de tek görüntüsünü alalım.

        static void Main(string[] args)
        {
            DB nesne1 = DB.getObje();

            //Rastgele ikinci sayının farklı olması için 100 ms bekle
            Thread.Sleep(100);

            DB nesne2 = DB.getObje();

            Console.WriteLine(nesne1.rndSayi);
            Console.WriteLine(nesne2.rndSayi);

            Console.ReadKey();
        }

Üretilen sayı aynı olacaktır. Çünkü nesnenin bir kere görüntüsü oluşacaktır.

Projeyi Buradan İndirebilirsiniz.

 

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

CSS ile Kalp Çizmek

Arkadaşlar sizinle bugün CSS3 ile bir kalp çizelim.

İlk önce html dosyamızı oluşturup Body nin içine bir div etiketi oluşturalım. Classı kalp olsun. Sonra css dosyamızı oluşturup html dosyasına çağıralım.

<!DOCTYPE html>
<html>
	<head>
		<title>CSS Kalp</title>
		<link rel="stylesheet" type="text/css" href="style.css">
	</head>
	<body>
		<div class="kalp"></div>
	</body>
</html>

 

Şimdi css dosyamızı kodlamaya başlayalım. Div etiketini bulunduğu pozisyona göre değiştirmek için position: relative yapalım.

Yüksekliği 170px yapalım.

Genişliği 200px yapalım.

Dışarıdan 20px boşluk verelim.

.kalp{
	position: relative;
	width: 200px;
	height: 170px;
	margin: 20px;
}

div etiketinden önce ve sonra işlem yapabilmek için before, after tanımlayalım.

Pozisyonunu absolute yapalım. Diğer nesnelerden bağımsız olsun.

Yükseliği 160px, Genişliği 100px olan iki nesne oluşturalım.

Arkaplanını kırmızı yapalım.

.kalp{
	position: relative;
	width: 200px;
	height: 170px;
	margin: 20px;
}

.kalp:after,
.kalp:before{
	content: "";
	position: absolute;
	height: 160px;
	width: 100px;
	background-color: red;
}

İki şekil arka arkaya olduğu için birmiş gibi görünüyor.

SnapCrab_No-0087

Birinci şekli sola yaslayalım. Diğer şekli soldan 100px genişlik kadar boşluk bırakalım.

.kalp{
	position: relative;
	width: 200px;
	height: 170px;
	margin: 20px;
}

.kalp:after,
.kalp:before{
	content: "";
	position: absolute;
	height: 160px;
	width: 100px;
	background-color: red;
}

.kalp:before{
	left: 100px;
}

.kalp:after{
	left: 0px;
}

SnapCrab_No-0088

Birinci şekli döndürmek için başlangıç noktasını alt, sağ noktayı referans olarak alalım ve sağa 45 derece açıyla döndürelim. İkinci şekli döndürmek için ise alt sol noktayı referans alalım ve sola doğru 45 derece açıyla döndürelim. Net görebilmek için border verelim.

.kalp{
	position: relative;
	width: 200px;
	height: 170px;
	margin: 20px;
}

.kalp:after,
.kalp:before{
	content: "";
	position: absolute;
	height: 160px;
	width: 100px;
	background-color: red;
	border: 1px solid #000;
}

/* birinci şekil */
.kalp:after{
	-webkit-transform:rotate(45deg);
	transform:rotate(45deg);

	-webkit-transform-origin: 100% 100%;
	transform-origin: 100% 100%;

	left: 0px;
}

/* ikinci şekil */
.kalp:before{
	-webkit-transform:rotate(-45deg);
	transform:rotate(-45deg);

	-webkit-transform-origin: 0 100%;
	transform-origin: 0 100%;
	
	left: 100px;
}

SnapCrab_No-0089

Üst köşe kenarlarını yuvarlak yapalım ve kenarlığı kaldıralım.

.kalp{
	position: relative;
	width: 200px;
	height: 170px;
	margin: 20px;
}

.kalp:after,
.kalp:before{
	content: "";
	position: absolute;
	height: 160px;
	width: 100px;
	background-color: red;
	border-radius: 50px 50px 0 0;
}

/* birinci şekil */
.kalp:after{
	-webkit-transform:rotate(45deg);
	transform:rotate(45deg);

	-webkit-transform-origin: 100% 100%;
	transform-origin: 100% 100%;

	left: 0px;
}

/* ikinci şekil */
.kalp:before{
	-webkit-transform:rotate(-45deg);
	transform:rotate(-45deg);

	-webkit-transform-origin: 0 100%;
	transform-origin: 0 100%;
	
	left: 100px;
}

SnapCrab_No-0090

 

Sağlıcakla kalın, Hayırlı günler…

Big-Endian ve Little-Endian Nedir?

İşlemcilerin byte’ları saklarken kullandığı sıralamadır. Büyük Sonlu (Big-Endian) ve Küçük Sonlu (Little-Endian) olmak üzere ikiye ayrılır.

 

Little-Endian (Küçük Sonlu)

i386 ve devamı olan işlemciler Little-Endian kullanır.

Elimizde 0x34E2561A 4 Byte’lık Integer verimiz olsun. Sağdan itibaren başlanarak 0x1A 0x56 0xE2 0x34 olarak saklanır.

 

Big-Endian (Büyük Sonlu)

Sun Sparc, Motorola 68K, PowerPC ve Java Sanal İşlemcisi (Java VM) Big-Endian kullanır.

0x7654139A verisi soldan itibaren başlanarak 0x76 0x54 0x13 0x9A olarak saklanır.