Merhabalar
Ekran Görüntüsü :
KOD İÇERİĞİ :
Güle güle kullanın...!
Ekran Görüntüsü :
KOD İÇERİĞİ :
Kod:
# Harita Ölçek Dönüşüm Betiği (BigInteger + Decimal)
Add-Type -AssemblyName System.Numerics
function Get-ScaleType {
param([System.Numerics.BigInteger]$scaleBI)
# scaleBI ile karşılaştırma için int64 güvenli aralıkta kontrol et
try {
$s = [int64]$scaleBI
} catch {
return "Aşırı Küçük Ölçek (1/x çok büyük)"
}
if ($s -le 1000) { return "Çok Büyük Ölçekli Harita (1/1.000 ve daha büyük)" }
elseif ($s -le 5000) { return "Büyük Ölçekli Harita (1/1.001 – 1/5.000)" }
elseif ($s -le 25000) { return "Orta Ölçekli Harita (1/5.001 – 1/25.000)" }
elseif ($s -le 100000) { return "Küçük Ölçekli Harita (1/25.001 – 1/100.000)" }
elseif ($s -le 500000) { return "Çok Küçük Ölçekli Harita (1/100.001 – 1/500.000)" }
else { return "Aşırı Küçük Ölçek (1/500.000+)" }
}
Write-Output "===== Harita Ölçek Dönüşüm Betiği ====="
# 1) Mesafe giriş
$distanceInput = Read-Host "Mesafeyi girin (sayı olarak, tam sayı veya ondalık kabul edilir)"
$unit = Read-Host "Birimi seçin (m/km)"
# Decimal için güvenli parse
try {
$distanceDecimal = [decimal]::Parse($distanceInput)
} catch {
Write-Error "Mesafe değeri okunamadı. Lütfen sayısal bir değer girin."
exit 1
}
# BigInteger için metre bazlı tam sayı (kullanıcı büyük tam sayı girerse)
# Eğer kullanıcı ondalıklı bir sayı verdiyse, tam mm hesabı için önce metri ondalıklı -> mm -> BigInteger kullanacağız.
# Ancak BigInteger::Parse sadece tam sayı string ister; bu yüzden integer kısmı alma veya ondalıklı mm dönüştürme yolu kullanacağız.
# Önce kullanıcı girişi metre cinsinden (decimal), sonra BigInteger metre kısmı oluşturulacak.
if ($unit -eq "km") {
$distanceDecimalMeters = $distanceDecimal * 1000
} else {
$distanceDecimalMeters = $distanceDecimal
}
# BigInteger metresini oluştur (tam metrenin tam kısmı)
# Burada metrenin tam kısmını alıyoruz; ondalıklı değer için mm hesabında decimal kullanacağız.
$distanceMetersWhole = [System.Numerics.BigInteger]::Parse([string][math]::Floor($distanceDecimalMeters))
# 2) Ölçek
$scaleInput = Read-Host "Ölçek katsayısı (ör: 50000)"
try {
$scaleDecimal = [decimal]::Parse($scaleInput)
} catch {
Write-Error "Ölçek değeri okunamadı. Lütfen sayısal bir değer girin."
exit 1
}
try {
$scaleBig = [System.Numerics.BigInteger]::Parse($scaleInput)
} catch {
Write-Error "Ölçek değeri BigInteger olarak okunamadı."
exit 1
}
# 3) Yön
$direction = Read-Host "Dönüşüm yönü? 1=Gerçek → Harita, 2=Harita → Gerçek"
Write-Output "`n===== Sonuçlar =====`n"
if ($direction -eq "1") {
# Gerçek -> Harita
# 1) Ondalıklı metre sonucu (decimal)
$mapDecMetre = $distanceDecimalMeters / $scaleDecimal
# formatlı gösterim (gerekirse)
$mapDecMetreStr = [string]::Format("{0:N6}", $mapDecMetre).TrimEnd('0').TrimEnd('.')
Write-Output "Ondalıklı (decimal) sonuç: $mapDecMetreStr metre"
# 2) Kesirsiz BigInteger sonuç (mm cinsinden)
# Kullanıcı tarafından girilen (metre) ondalıklı değer -> önce mm (decimal) -> round down to integer mm
$distanceMM_decimal = [math]::Floor($distanceDecimalMeters * 1000) # decimal -> floor to mm
$distanceMM_BI = [System.Numerics.BigInteger]::Parse([string]$distanceMM_decimal)
# mm cinsinden harita mesafesi = distanceMM_BI / scaleBig (tam mm, küsürat atılır)
if ($scaleBig -eq [System.Numerics.BigInteger]::Zero) {
Write-Error "Ölçek 0 olamaz."
exit 1
}
$mapMM_BI = [System.Numerics.BigInteger]::Divide($distanceMM_BI, $scaleBig)
Write-Output "Kesirsiz BigInteger sonuç: $mapMM_BI mm"
# 3) mm -> m cm mm ayrıştırma
$m = [System.Numerics.BigInteger]::Divide($mapMM_BI, 1000)
$rem_mm = $mapMM_BI % 1000
$cm = [System.Numerics.BigInteger]::Divide($rem_mm, 10)
$mm = $rem_mm % 10
Write-Output "Ayrıştırılmış sonuç: ${m} m ${cm} cm ${mm} mm"
# Açıklama / ölçek türü
$scaleType = Get-ScaleType -scaleBI $scaleBig
$explanation = "Arazi gerçekte büyük olduğunda, 1/$scaleBig ölçekli bir harita onu $scaleBig kat küçültür. " +
"Bu yüzden haritada görülen '$([string]$mapDecMetreStr) m' uzunluğundaki çizgi, gerçekte çok daha büyük bir değeri temsil eder. " +
"Ölçek türü: $scaleType."
Write-Output "`nAçıklama:`n$explanation"
}
elseif ($direction -eq "2") {
# Harita -> Gerçek
# 1) Ondalıklı (decimal) gerçek metre
$realDecMetre = $distanceDecimalMeters * $scaleDecimal
$realDecMetreStr = [string]::Format("{0:N6}", $realDecMetre).TrimEnd('0').TrimEnd('.')
Write-Output "Ondalıklı (decimal) sonuç: $realDecMetreStr metre"
# 2) BigInteger tam mm hesap
# Kullanıcının girdiği mesafe (map metre) -> önce mm tam kısm
$mapMM_decimal = [math]::Floor($distanceDecimalMeters * 1000)
$mapMM_BI = [System.Numerics.BigInteger]::Parse([string]$mapMM_decimal)
$realMM_BI = [System.Numerics.BigInteger]::Multiply($mapMM_BI, $scaleBig)
Write-Output "Kesirsiz BigInteger sonuç: $realMM_BI mm"
# 3) mm -> m cm mm ayrıştırma
$m = [System.Numerics.BigInteger]::Divide($realMM_BI, 1000)
$rem_mm = $realMM_BI % 1000
$cm = [System.Numerics.BigInteger]::Divide($rem_mm, 10)
$mm = $rem_mm % 10
Write-Output "Ayrıştırılmış sonuç: ${m} m ${cm} cm ${mm} mm"
$scaleType = Get-ScaleType -scaleBI $scaleBig
$explanation = "1/$scaleBig ölçekli haritadaki '$distanceDecimalMeters m' uzunluğu, gerçekte $([string]$realDecMetreStr) metreye karşılık gelir. Ölçek türü: $scaleType."
Write-Output "`nAçıklama:`n$explanation"
}
else {
Write-Error "Geçersiz yön seçimi. Lütfen 1 veya 2 girin."
}
Write-Host ""
Read-Host "Çıkmak için Enter'a bas..."
Güle güle kullanın...!