# Lerp

- **Ortam:** İstemci, Sunucu, Menü
- **İngilizce aslı:** https://wiki.facepunch.com/gmod/Global.Lerp
- **Çeviri tarihi:** 2025-09-08

```lua
number Lerp( number t, number from, number to )
```

## Açıklama

Başlangıç sayısından bitiş sayısına doğru doğrusal bir enterpolasyon gerçekleştirir.

Bu fonksiyon, hareketleri yumuşatmak için çok verimli ve kolay bir yol sağlar.

Doğrusal enterpolasyon kullanarak doğrusal olmayan animasyonlara sahip olmanızı sağlayan fonksiyonlar için ayrıca bakınız: [math.ease](https://gmod.tr/wiki/math.ease).

> **NOT:** Bu fonksiyon, animasyonlarla uğraşıyorsanız ilk argümanda sabit bir değerle kullanılmak için tasarlanmamıştır! Zamanla değişen bir değer kullanın. Lerp'in animasyonlar için **doğru** kullanımı için örneğe bakın.

## Argümanlar

1. [number](https://gmod.tr/wiki/number) **t**: Sonucu bulmak için kullanılan oran. Bu sayı 0 ile 1 arasında sıkıştırılır. Sabit bir değer olmamalıdır.
2. [number](https://gmod.tr/wiki/number) **from**: Başlangıç sayısı. Eğer t 0 ise sonuç bu değere eşit olacaktır.
3. [number](https://gmod.tr/wiki/number) **to**: Bitiş sayısı. Eğer t 1 ise sonuç bu değere eşit olacaktır.

## Döndürülen Değer

1. [number](https://gmod.tr/wiki/number): Doğrusal enterpolasyonun sonucu, `from + (to - from) * t`.

### Örnek

Animasyonlar için basit Lerp kullanım örneği.

```lua
-- Zamanlı animasyonlar yapmak için "Lerp" fonksiyonunu kullanmak istiyorsanız,
-- animasyonun başlangıç zamanını saklamak için bir değişken gereklidir.
local animation_start, animation_duration = CurTime(), 2

hook.Add( "HUDPaint", "LerpAnimation", function()
	local animation_progress = ( CurTime() - animation_start ) / animation_duration

	-- "Lerp" fonksiyonu daha sonra ilk argüman olarak oran kullanılarak çağrılır.
	-- İkinci argüman, oran "0" olduğunda başlamak istediğiniz değer ("from") ve
	-- üçüncü argüman, oran "1" olduğunda ulaşılacak son değerdir ("to").

	-- Eğer "from" değeri "0" olacaksa, "to * animation_progress" formülünü kullanmayı düşünebilirsiniz.
	-- Eğer "to" değeri "0" ise, "from * ( 1 - animation_progress )" formülünü kullanabilirsiniz.
	-- Bu yöntemler biraz daha hızlıdır ve "Lerp" kullanmışsınız gibi aynı sonucu verir.

	-- Örneğin bu satırı yazmanın farklı bir yolu şöyle olurdu:
	-- 	"local animated_value = 255 * ( 1 - animated_progress )"

	-- Animasyonu tersine çevirmek isteseydiniz, satır şöyle olabilirdi:
	-- 	"local animated_value = Lerp( animation_progress, 0, 255 )"
	-- 		ya da
	-- 	"local animated_value = 255 * animation_progress"
	local animated_value = Lerp( animation_progress, 255, 0 )

	-- Bu durumda "Lerp" fonksiyonu, bir dörtgenin yavaşça kaybolmasını sağlamak için kullanılıyor.
	surface.SetDrawColor( 255, 255, 255, animated_value )
	surface.DrawRect( 50, 50, 300, 300 )

	-- Başlangıç zamanını ve süreyi toplarsanız toplam animasyon süresini elde edersiniz,
	-- ve bunu mevcut zamanla karşılaştırırsanız animasyonun tamamlanıp tamamlanmadığını
	-- kontrol edebilirsiniz.

	-- Animasyonun tamamlanıp tamamlanmadığını kontrol etmenin biraz daha doğru ve optimize edilmiş bir yolu,
	-- "animation_progress" değerinin "1"e eşit olup olmadığını veya "animated_value"nun "Lerp" çağrıldığında
	-- kullanılan üçüncü argümana eşit olup olmadığını kontrol etmektir.
	if ( animation_start + animation_duration <= CurTime() ) then
		-- Bu örnekte, animasyon tamamlandığında başlangıç zamanını sıfırlıyoruz.
		animation_start = CurTime()
	end
end )
```

### Örnek

Gelişmiş Lerp animasyon örneği: Önceki değerden yeni can değerine ulaşmak için can değişimini 0.5 saniye boyunca yumuşatacak bir can barı.

```lua
local start, oldhp, newhp = 0, -1, -1
local barW = 200
local animationTime = 0.5 -- saniye

hook.Add( "HUDPaint", "LerpAnimation", function()
	-- Yerel oyuncu hala yükleniyor, hiçbir şey yapma
	if ( !IsValid( LocalPlayer() ) ) then return end

	local hp = LocalPlayer():Health()
	local maxhp = LocalPlayer():GetMaxHealth()

	-- Değerler henüz başlatılmadı, şimdi başlat
	if ( oldhp == -1 and newhp == -1 ) then
		oldhp = hp
		newhp = hp
	end

	-- Burada farklı bir yumuşatma fonksiyonu kullanabilirsiniz
	local smoothHP = Lerp( ( SysTime() - start ) / animationTime, oldhp, newhp )

	-- Can değiştirildi, animasyonu başlat
	if newhp ~= hp then
		-- Eski animasyon hala devam ediyor, ayarla
		if ( smoothHP ~= hp ) then
			-- Mevcut "yumuşak" pozisyonumuzun hedef olduğunu varsayalım ki animasyon
			-- eski hedefe atlamasın ve yeni hedefe oradan başlamasın
			newhp = smoothHP
		end

		oldhp = newhp
		start = SysTime()
		newhp = hp
	end

	draw.RoundedBox( 4, 100, 200, barW, 100, color_black )
	draw.RoundedBox( 4, 100, 200, math.max( 0, smoothHP ) / maxhp * barW, 100, color_white )
end )
```

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/Global.Lerp
