---
tags:
    - "Map"
    - "Scale"
    - "Convert"
    - "Normalize"
    - "Range"
    - "Proportion"
    - "Rule of Three"
---

# Remap

[Math](../index.md) / [Range](index.md) / **Remap** Number, From, To

<div class="grid cards" markdown>

* :green_circle: Can Read

* :red_circle: Cannot Write

</div>

## Description

Converts a number from one range of values to another one, keeping its proportion

## Parameters

| Name | Description |
| :--- | :---------- |
| Number | The number that is converted |
| From Min | The lowest value of the original range |
| From Max | The highest value of the original range |
| To Min | The lowest value of the resulting range |
| To Max | The highest value of the resulting range |
| Clamp | Whether the result stays inside the resulting range |

## Code

```cs
using System;
using UnityEngine;
using VisualScript.Icons;

namespace VisualScript.Runtime
{
    [Get]

    [Title("Remap")]
    [Category("Math/Range/Remap", "Number, From, To")]

    [Description("Converts a number from one range of values to another one, keeping its proportion")]
    [Image(typeof(IconInterpolate), ColorTheme.Type.Yellow, typeof(BadgeSync))]

    [Parameter("Number", "The number that is converted")]
    [Parameter("From Min", "The lowest value of the original range")]
    [Parameter("From Max", "The highest value of the original range")]
    [Parameter("To Min", "The lowest value of the resulting range")]
    [Parameter("To Max", "The highest value of the resulting range")]
    [Parameter("Clamp", "Whether the result stays inside the resulting range")]

    [Keywords("Map", "Scale", "Convert", "Normalize", "Range", "Proportion", "Rule of Three")]

    [Serializable]
    public class TypeNumberMathRemap : TypeNumber
    {
        [SerializeField] private GetNumber m_Number = new GetNumber();

        [SerializeField] private GetNumber m_FromMin = new GetNumber(0f);
        [SerializeField] private GetNumber m_FromMax = new GetNumber(1f);

        [SerializeField] private GetNumber m_ToMin = new GetNumber(0f);
        [SerializeField] private GetNumber m_ToMax = new GetNumber(100f);

        [SerializeField] private GetBool m_Clamp = new GetBool(true);

        public override double GetPreview(GameObject source) => Remap(
            this.m_Number.GetPreview(source),
            this.m_FromMin.GetPreview(source),
            this.m_FromMax.GetPreview(source),
            this.m_ToMin.GetPreview(source),
            this.m_ToMax.GetPreview(source),
            this.m_Clamp.GetPreview(source)
        );

        public override double Get(Args args) => Remap(
            this.m_Number.Get(args),
            this.m_FromMin.Get(args),
            this.m_FromMax.Get(args),
            this.m_ToMin.Get(args),
            this.m_ToMax.Get(args),
            this.m_Clamp.Get(args)
        );

        private static double Remap(double number, double fromMin, double fromMax, double toMin, double toMax, bool clamp)
        {
            double fromRange = fromMax - fromMin;
            if (Math.Abs(fromRange) <= double.Epsilon) return toMin;

            double ratio = (number - fromMin) / fromRange;
            if (clamp) ratio = Math.Clamp(ratio, 0f, 1f);

            return toMin + (toMax - toMin) * ratio;
        }

        public override string ToString()
        {
            return $"Remap {this.m_Number} to ({this.m_ToMin}, {this.m_ToMax})";
        }

        protected override SubscriptionMode Subscription => SubscriptionMode.OnChange;
    }
}

```

