আমি কীভাবে ডিগ্রি থেকে রেডিয়ানে রূপান্তর করতে পারি?


107

আমি এই Obj-Cকোডটি কোডে রূপান্তর করার চেষ্টা করছি Swiftকিন্তু আমি জানি না যে এই কোডটির সমতুল্য হওয়া উচিত?

#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)

আমি googled এবং পাওয়া এই

তবে আমি বুঝতে পারি না কীভাবে আমার ক্ষেত্রে এটিকে সুইফটে রূপান্তর করা যায়?


আমি মনে করি আপনি কিছু কোড অনুপস্থিত। আপনি কি সব প্রাসঙ্গিক কোড যুক্ত করতে পারেন? অন্য কোন ডিগ্রি মত সংজ্ঞায়িত?
ব্ল্যাকহ্যাটসামুরাই

এটি আমার সুইফট কোড: পেস্টবিন.
com/bZ4a7EVN

আপনি আমাকে .h ফাইল প্রদর্শন করতে পারেন?
ব্ল্যাকহ্যাটসামুরাই

এটি একটি ম্যাক্রো। আপনি একটি ফাংশন চান।
gnasher729

উত্তর:


265

এক্সকোড 11 • 5.1 বা তার পরে সুইফ্ট

extension BinaryInteger {
    var degreesToRadians: CGFloat { CGFloat(self) * .pi / 180 }
}

extension FloatingPoint {
    var degreesToRadians: Self { self * .pi / 180 }
    var radiansToDegrees: Self { self * 180 / .pi }
}

খেলার মাঠ

45.degreesToRadians         // 0.7853981633974483

Int(45).degreesToRadians    // 0.7853981633974483
Int8(45).degreesToRadians   // 0.7853981633974483
Int16(45).degreesToRadians  // 0.7853981633974483
Int32(45).degreesToRadians  // 0.7853981633974483
Int64(45).degreesToRadians  // 0.7853981633974483

UInt(45).degreesToRadians   // 0.7853981633974483
UInt8(45).degreesToRadians  // 0.7853981633974483
UInt16(45).degreesToRadians // 0.7853981633974483
UInt32(45).degreesToRadians // 0.7853981633974483
UInt64(45).degreesToRadians // 0.7853981633974483

Double(45).degreesToRadians    // 0.7853981633974483
CGFloat(45).degreesToRadians   // 0.7853981633974483
Float(45).degreesToRadians     // 0.7853981
Float80(45).degreesToRadians   // 0.78539816339744830963

আপনি যদি বাইনারি পূর্ণসংখ্যাকে সর্বদা একটি সিজিফ্লোট ফেরত না দেওয়ার পরিবর্তে একটি ভাসমান বিন্দু টাইপ করতে চান তবে আপনি একটি গণিত সম্পত্তি পরিবর্তে জেনেরিক পদ্ধতি তৈরি করতে পারেন:

extension BinaryInteger {
    func degreesToRadians<F: FloatingPoint>() -> F {  F(self) * .pi / 180 }
}

let radiansDouble: Double = 45.degreesToRadians()   // 0.7853981633974483
let radiansCGFloat: CGFloat = 45.degreesToRadians() // 0.7853981633974483
let radiansFloat: Float = 45.degreesToRadians()     // 0.7853981
let radiansFloat80: Float80 = 45.degreesToRadians() // 0.78539816339744830963

4
আপনার প্রসারিত করা উচিত নয় CGFloat?
জোড়ায়র

1
@ জোরেয়ার সুইফট 3 এ আপডেট হয়েছে এবং ফ্লোটিংপয়েন্টটি বাড়িয়ে এখন তাদের
সমস্তটি

3
প্রকৃতপক্ষে, সুইফ্ট 3 এ আপনি পরিমাপের ধরণগুলি ব্যবহার করতে পারেন এবং আপনাকে রূপান্তর সূত্রটি আদৌ জানতে হবে না!
ম্যাট

3
উল্লেখ্য তা যে এই superpro ডগা ... stackoverflow.com/a/28600210/294884
Fattie

1
বিনা কারণে নিচে ভোট দেওয়ার কোনও মানে হয় না। একটি মন্তব্য পোস্ট করুন
লিও ডাবাস

63

এটি আপনি যা অনুরূপ চেয়েছিলেন তা নয়, তবে সুইফ্ট 3 / আইওএস 10 তে আপনি পরিমাপের ধরণটি ব্যবহার করতে পারেন এবং সূত্রটি না জেনে রূপান্তরটি করতে পারেন!

let result = Measurement(value: 45, unit: UnitAngle.degrees)
    .converted(to: .radians).value

4
আবার কাজের জায়গায় আশ্চর্যজনক @ ম্যাট, ধন্যবাদ! দুর্ভাগ্যক্রমে শুধুমাত্র আইওএস 10।
অর্থ-বিষয়গুলি

মজার বিষয় যে let রেডিয়ানে = CGFloat (30.3 * .pi / 180.0) দিন radians2 = পরিমাপ (মান: 30.3, ইউনিট: UnitAngle.degrees) (হবে: .radians) .converted .value আলাদা হতে হবে: 0,5288347633542818 এবং 0,5288345742619878
Zaporozhchenko Oleksandr

এবং নিশ্চিত "" পরিমাপ "কেবলমাত্র আইওএস 10.0 বা আরও নতুনতে উপলব্ধ"
জাপুরোঝেঙ্কো ওলেকসান্দার

42

অ্যাপল রূপান্তরকরণের জন্য এই জিএলকিট ফাংশন সরবরাহ করে :

func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float

জিএলকিট শিগগিরই মঞ্চ ছাড়ছে, এখন থেকে এটি ধাতব জগত, বাই জিএল। ম্যাক এ আইপ্যাড অ্যাপ্লিকেশন পোর্টিং হিসাবে, GLKit আর সমর্থিত হয় না !.
জুগুয়াং

17
let angle = 45° // angle will be in radians, 45 is in degrees

সুইফট 3 এর অধীন সংকলন করুন । তবুও সমস্ত মান বজায় রাখুন, সিজিফ্লোটস সহ রেডিয়ানে সমস্ত গণনা করুন ... তবে ডিগ্রীতে ধ্রুবকগুলির সাথে কোডটি আরও পঠনযোগ্য করে তুলুন। উদাহরণস্বরূপ: 90। চিহ্নটি জাদুকরীভাবে রেডিয়ান রূপান্তর করতে ডিগ্রি করবে।

এটি কীভাবে সেট আপ করবেন:

° চিহ্নের জন্য একটি পোস্টফিক্স অপারেটর সংজ্ঞায়িত করুন এবং ব্যবহার করুন। এই অপারেটরটি ডিগ্রি থেকে রেডিয়ানে রূপান্তর করবে। এই উদাহরণটি ইনটসের জন্য, আপনার যদি প্রয়োজন হয় তবে এটি ফ্লোটের ধরণের জন্যও প্রসারিত করুন।

postfix operator °

protocol IntegerInitializable: ExpressibleByIntegerLiteral {
  init (_: Int)
}

extension Int: IntegerInitializable {
  postfix public static func °(lhs: Int) -> CGFloat {
    return CGFloat(lhs) * .pi / 180
  }
}

ব্যবহারের কয়েকটি উদাহরণ:

let angle = 45°

contentView.transform = CGAffineTransform(rotationAngle: 45°)

let angle = 45
contentView.transform = CGAffineTransform(rotationAngle: angle°)

সতর্কবাণী!

এই রূপান্তরটি দু'বার ব্যবহার করা খুব সহজ (ভুল হিসাবে রেডিয়ানগুলির মধ্যে ইতিমধ্যে একটি মান হিসাবে), আপনি ফলাফল হিসাবে খুব অল্প সংখ্যক পাবেন এবং সম্ভবত ফলশ্রুতি কোণটি সর্বদা শূন্য হবে ... একই ব্যবহার করবেন না ° দুবার মান (দুবার রূপান্তর করবেন না) !!:

// OBVIOUSLY WRONG!
let angle = 45°° // ° used twice here

// WRONG! BUT EASY TO MISS
let angle = 45° // ° used here
contentView.transform = CGAffineTransform(rotationAngle: angle°) // ° also used here

IntegerInitializableপ্রোটোকল অর্থহীন। ইন্ট ইতিমধ্যে মেনে ExpressibleByIntegerLiteral
চলেছে

বিটিডব্লিউ আপনি যে কোনও পূর্ণসংখ্যার সমর্থন করতে এবং কোনও ফ্লোটিং পয়েন্টও ফিরিয়ে দিতে এই অপারেটরটিকে জেনেরিক করতে পারেন। public extension FixedWidthInteger { postfix static func °<T: FloatingPoint>(lhs: Self) -> T { T(lhs) * .pi / 180 } }
লিও ডাবাস

এবং জেনেরিক পদ্ধতি তৈরি করার সময় আপনি এটি সম্পর্কে মন্তব্য করার আগে সংকলক ফলাফলের ধরণটি নির্ধারণ করতে না পারলে আপনাকে স্পষ্টভাবে ফলাফলের ধরণ সেট করতে হবে let angle: CGFloat = 45°। তবে এটি প্রয়োজনীয় নয় যেখানে এটি কোনও CGFloatবা কোনও FloatingPointপ্রকারের প্রত্যাশা করেCGAffineTransform(rotationAngle: 45°)
লিও ডাবাস

11

এছাড়াও, ফ্রন রেডিয়েনগুলি ডিগ্রিতে রূপান্তর করতে (যদি কেউ এই বিষয়ে গুগলে হোঁচট খায়):

var degrees = radians * (180.0 / M_PI)

3

চলক নামগুলি তৈরি করার সময় আপনি আর ASCII অক্ষরগুলিতে সীমাবদ্ধ নন, সুতরাং এটি কীভাবে π (Alt-p) ব্যবহার করে:

typealias RadianAngle = CGFloat

let π = RadianAngle(M_PI)
let π_x_2 = RadianAngle(M_PI * 2)
let π_2 = RadianAngle(M_PI_2)
let π_4 = RadianAngle(M_PI_4)

extension RadianAngle {
    var degrees: CGFloat {
        return self * 180 / π
    }
    init(degrees: Int) {
        self = CGFloat(degrees) * π / 180
    }
}

ব্যবহারের উদাহরণ:

let quarterCircle = RadianAngle(degrees: 90)
print("quarter circle = \(quarterCircle) radians")
// quarter circle = 1.5707963267949 radians

let halfCircle = π
print("half circle = \(halfCircle.degrees) degrees")
// half circle = 180.0 degrees

2

সুইফট 4.2

আপনি বিশ্বব্যাপী জেনেরিক ফাংশন লিখতে পারেন:

public func radians<T: FloatingPoint>(degrees: T) -> T {
    return .pi * degrees / 180
}

public func degrees<T: FloatingPoint>(radians: T) -> T {
    return radians * 180 / .pi
}

উদাহরণ:

let cgFloat: CGFloat = 23.0
let double: Double = 23.0
let float: Float = 23.0
let int: Int = 23

let cgf = radians(degrees: cgFloat) // 0.4014 CGFloat
let d = radians(degrees: double)    // 0.4014 Double
let f = radians(degrees: float)     // 0.4014 Float
let i = radians(degrees: int)       // compile error

আপনি যখন আপনার ভাসমান প্রকারের মতো প্রসারিত করতে চান না এমন ক্ষেত্রে In

extension FloatingPoint { ... }

কেন সহজভাবে নয় return .pi * degrees / 180?
লিও ডাবাস

@LeoDabus কারণ Tহল FloatingPointটাইপ এবং 180 হয় Intপ্রকার। দ্রুতগতিতে আপনি বিভিন্ন ধরণের গণনা করতে পারবেন না।
টিখোনভ আলেকজান্ডার

আপনি ভুল. সুইফট প্রকারটি অনুমান করতে পারে। এটি ঠিক একইরকম আচরণ করে যেমন আপনি ফ্লোটিংপয়েন্ট প্রকারটি প্রসারিত করছেন। 180 কোনও জিনিস হতে পারে। অগত্যা একটি
আন্ত


1
180.0 টি টি দরকার কারণ টি অগত্যা ডাবল নয়। এটি কোনও ভাসমান পয়েন্ট টাইপ হতে পারে। আপনি আপনার ডাবল 180.0
লিও ডাবাস

1

আমি উপরোক্ত উল্লিখিত @ t1ser একই নীতিটি ব্যবহার করব, তবে ডিগ্রির জন্য দশমিকগুলি CGFloatব্যবহার করা আরও সহজ করার জন্য একটি এক্সটেনশন তৈরি করব (উদাহরণস্বরূপ, আপনার একটি 23.4 ডিগ্রি থাকতে পারে):

extension CGFloat {
    func degrees() -> CGFloat {
        return self * .pi / 180
    }

    init(degrees: CGFloat) {
        self = degrees.degrees()
    }
}

এটি ব্যবহার করাও বেশ সহজ হবে (মূলত কারণ আমি ব্যক্তিগতভাবে কীভাবে ° type টাইপ করতে জানতাম না - যদি আপনি হয় না তবে এটি option+shift+8বিটিডব্লিউ):

let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()

অথবা আরম্ভকারীটি ব্যবহার করতে:

let convertedDegrees = CGFloat(degrees: 45.3)

-5

দ্রুত 2.3

func  kilometersBetween(Place1:CLLocationCoordinate2D , Place2:CLLocationCoordinate2D) -> Double{
    var start = MKMapPointForCoordinate(Place1)
    var finish = MKMapPointForCoordinate(Place2)
    print(MKMetersBetweenMapPoints(start, finish) / 1000)
    return MKMetersBetweenMapPoints(start, finish) / 1000
} 

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
নিক 3500
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.