VBからID3タグをいじる方法を教えてください。
ワードパッドでひらいてもどこがタグだか分かりません
できればサンプル(ソースでも)お願いします

このQ&Aに関連する最新のQ&A

A 回答 (4件)

サンプル作ってみました。



ID3=MP3のタグ情報と勝手に思って作ってます。
やはり、MP3のファイル末尾の128バイトに情報が入っているようです。

そのタグの中身は
TAG [文字列 3BYTE "TAG"で固定] 
TRACK NAME トラック名 [文字列 30BYTE]
AIRTIST NAME アーティスト名 [文字列 30BYTE]
ALUBM NAME アルバム名 [文字列 30BYTE]
YEAR リリース年号 [文字列 4BYTE]
COMMENT コメント [文字列 30BYTE]  (ID3 Tag v1.1 では 28BYTE)
GENRE ジャンル番号 [数値 0~255]
です。

サンプルのソースはエラーチェックを入れてませんので、ジャンル番号に文字列や大きな数字を入れたらバグると思います。それと、直接そのファイルを操作するのではなく、タグを読み取り、新たなタグ情報をもったファイルを作成する仕組みになってます。擬似的に作成して、ファイルをコピーしたら、元のファイルを操作したように見えるので、そこら辺は適当に扱ってください。


サンプルに必要なもの
フォーム
コマンドボタン1と2
ラベル1~6
テキストボックス1~6




Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  Destination As Any, _
  Source As Any, _
  ByVal Length As Long _
)

Private Const testFile1 As String = "C:\1.mp3" '元となるファイル
Private Const testFile2 As String = "C:\2.mp3" '作成されるファイル

Private Const AREA_TAG As Long = 128      'タグの領域は128バイト

Private lngFileSize   As Long   'ファイルサイズ
Private fileBuf()    As Byte   '読み込みバッファ

Private Sub Command1_Click()
  Dim lngFile   As Long   'ファイルナンバ
  Dim tagBuf()  As Byte   'タグ情報

  'ファイル操作の初期化
  Reset
  
  'ファイルサイズを取得
  lngFileSize = FileLen(testFile1)
  
  '読み込みバッファの領域確保
  ReDim fileBuf(lngFileSize - 1) As Byte
  
  'バッファを取得
  lngFile = FreeFile
  Open testFile1 For Binary As #lngFile
    Get #lngFile, , fileBuf
  Close #lngFile

  'タグエリアの領域確保
  ReDim tagBuf(AREA_TAG - 1) As Byte
  'バッファからタグ情報のみ取得
  Call copyAry(tagBuf(0), fileBuf(lngFileSize - AREA_TAG), AREA_TAG)

  With Me
    'TRACK NAME を取得(3バイト目から30バイト)
    .Text1.Text = getStringforUniByte(tagBuf, 4, 30)
    'AIRTIST NAME を取得(34バイト目から30バイト)
    .Text2.Text = getStringforUniByte(tagBuf, 34, 30)
    'ALUBM NAME を取得(64バイト目から30バイト)
    .Text3.Text = getStringforUniByte(tagBuf, 64, 30)
    'YEAR を取得(94バイト目から4バイト)
    .Text4.Text = getStringforUniByte(tagBuf, 94, 4)
    'COMMENT を取得(98バイト目から30バイト)
    .Text5.Text = getStringforUniByte(tagBuf, 98, 30)
    'GENRE を取得(128バイト目の値)
    .Text6.Text = tagBuf(128 - 1)
  End With

End Sub

Private Sub Command2_Click()
  Dim lngFile   As Long   'ファイルナンバ
  Dim tagBuf()  As Byte   'タグ情報
  Dim wkStr    As String  'ワークの文字列
  Dim setStr   As String  '実際に収納する文字列

  'ファイル操作の初期化
  Reset
  
  With Me
    'お決まりの部分です
    setStr = "TAG"
    
    'TRACK NAME を取得
    wkStr = fixStr_setNullChar(.Text1.Text, 30)
    setStr = setStr & wkStr
    
    'AIRTIST NAME を取得
    wkStr = fixStr_setNullChar(.Text2.Text, 30)
    setStr = setStr & wkStr
    
    'ALUBM NAME を取得
    wkStr = fixStr_setNullChar(.Text3.Text, 30)
    setStr = setStr & wkStr
    
    'YEAR を取得
    wkStr = fixStr_setNullChar(.Text4.Text, 4)
    setStr = setStr & wkStr
    
    'COMMENT を取得
    wkStr = fixStr_setNullChar(.Text5.Text, 30)
    setStr = setStr & wkStr
    
    'ここまでの文字列をFormUnicodeに変換
    setStr = StrConv(setStr, vbFromUnicode)
    'バッファにセット(この情報をセットすると、tagBufは127バイトの領域を持つ)
    tagBuf = setStr
    
    'GENRE を取得
    wkStr = .Text6.Text
    'GENRE の情報は末尾のバイト目にそのまま値をセット
    ReDim Preserve tagBuf(AREA_TAG - 1) As Byte
    tagBuf(AREA_TAG - 1) = wkStr
  End With
  
  'バッファにタグ情報をセット
  Call copyAry(fileBuf(lngFileSize - AREA_TAG), tagBuf(0), AREA_TAG)
  
  '新たなタグ情報をもったファイルを作成する
  lngFile = FreeFile
  Open testFile2 For Binary As #lngFile
    'バッファ取得
    Put #lngFile, , fileBuf
  Close #lngFile
End Sub

Private Sub Form_Load()
  With Me
    '各コントロールの初期化
    .Command1.Caption = "取得"
    .Command2.Caption = "更新"
    
    .Label1.Caption = "TRACK NAME"
    .Label2.Caption = "AIRTIST NAME"
    .Label3.Caption = "ALUBM NAME"
    .Label4.Caption = "YEAR"
    .Label5.Caption = "COMMENT"
    .Label6.Caption = "GENRE"
    
    .Text1.Text = ""
    .Text2.Text = ""
    .Text3.Text = ""
    .Text4.Text = ""
    .Text5.Text = ""
    .Text6.Text = ""
  
    '一応最長文字数を指定しておきますが、あくまで半角での文字数です。全角文字は無理です。
    .Text1.MaxLength = 30
    .Text2.MaxLength = 30
    .Text3.MaxLength = 30
    .Text4.MaxLength = 4
    .Text5.MaxLength = 30
    .Text6.MaxLength = 3  'ここは0~255です
  End With
End Sub

'配列の中身をエリアの分だけコピーする関数
Private Sub copyAry(inDest As Byte, inSrc As Byte, inArea As Long)
  Call CopyMemory(inDest, ByVal VarPtr(inSrc), ByVal LenB(inSrc) * inArea)
End Sub


'バイトで納められたUNICODE文字列を指定位置から、指定の長さを取得する関数
Private Function getStringforUniByte(inByte() As Byte, inStartPos As Long, inLength As Long) As String
  Dim wkBuf() As Byte   'ワークのバッファ
  Dim wkStr  As String  'ワークの文字列
  Dim lngFindNull As Long 'vbNullChar を見つけるときのワーク
  
  ReDim wkBuf(inLength - 1) As Byte
  
  '指定範囲の文字列を得る
  Call copyAry(wkBuf(0), inByte(inStartPos - 1), inLength)
  wkStr = StrConv(wkBuf, vbUnicode)
  
  '文字列にvbNullCharが含まれている時、それをはずす
  lngFindNull = InStr(1, wkStr, vbNullChar)
  If lngFindNull > 0 Then
     wkStr = Mid(wkStr, 1, lngFindNull - 1)
  End If
  
  '戻りの文字列セット
  getStringforUniByte = wkStr
End Function


'文字数をvbNullCharで調整して返す関数
Private Function fixStr_setNullChar(inStrings As String, inLength As Long) As String
  Dim wkStr  As String  'ワークの文字列
  
  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(30, vbNullChar)
  
  'FromUnicodeに変換
  wkStr = StrConv(wkStr, vbFromUnicode)
  
  '左からinLength分の文字を取得
  wkStr = LeftB(wkStr, inLength)
  
  'Unicodeに変換して返す
  fixStr_setNullChar = StrConv(wkStr, vbUnicode)
End Function

参考URL:http://www.angel.ne.jp/~mike/about_mp3/id3_v1.html
    • good
    • 0
この回答へのお礼

こんな立派なサンプルを作っていただき,ありがとうございます。
之でID3をいじる部分は完成しました。
多分完成したら,ベクターに飾るので,よかったら,見にきてください(11月終わりごろだと思います)
MP3スタジオという名前です

お礼日時:2001/10/23 21:44

何度もすいません。

自己レスです。。。

  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(30, vbNullChar)

っていうのが最後の方にあるんですが、

  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(inLength, vbNullChar)

に修正してください。
30→inLength です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
これで今作っているMP3プレイヤーも少し完成に近づきました

お礼日時:2001/10/23 21:37

ID3タグっていうのはMPEGとかの情報ですか?



もしそうなら、ファイル末尾の128バイトという情報がありました。
もうちょっと調査が必要です。

もう少し調べてみますが、ほかに詳しい人がいたらお願いします。
    • good
    • 0

ID3ってなんなの?


聞いたことないです。

それがわからない人が多いと思いますよ。

ID3の参考アドレスを教えてもらえたら、何とかわかるかも?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q入れ子にしたddタグをcssで制御できません。

入れ子にしたddタグのマージンをcssで指定してみましたが、うまくいきません。

</dd>
<dl>
 <dt>111111</dt>
  <dd>22222222222222222</dd>
  <dd>33333333333</dd>
 <dt>444444</dt>
  <dd>5555555</dd>
   <dl>
    <dt>66666666</dt>
     <dd>777777777</dd>
   </dl>
 </dd>
</dl>

のようにddの中にまたdlから始まるのを入れ子にしました。

それで、cssで

.hoge dd{
color:#FFFFFF;
margin:10px;
}

とすると、ddタグの文字が白くなります。それはわかるのですが、上の入れ子の例の777777のように入れ子になったddだけにスタイルシートを掛けたいのです。
試しに

.hoge dl dt dd dl dt dd{
color:#FFFFFF;
margin:10px;
}
や、
.hoge dd dl dt dd{
color:#FFFFFF;
margin:10px;
}
を試してみましたが、うまくいきませんでした。

どうしたら、入れ子の中のddだけにスタイルシートを適用できるようになりますでしょうか。もしくは、このようなddを入れ子にする方法は使わないのでしょうか。

入れ子にしたddタグのマージンをcssで指定してみましたが、うまくいきません。

</dd>
<dl>
 <dt>111111</dt>
  <dd>22222222222222222</dd>
  <dd>33333333333</dd>
 <dt>444444</dt>
  <dd>5555555</dd>
   <dl>
    <dt>66666666</dt>
     <dd>777777777</dd>
   </dl>
 </dd>
</dl>

のようにddの中にまたdlから始まるのを入れ子にしました。

それで、cssで

.hoge dd{
color:#FFFFFF;
margin:10px;
}

とすると、ddタグ...続きを読む

Aベストアンサー

次のようにすれば内側のddにだけスタイルが有効になります。

.hoge dd dd {
color:#FFFFFF;
margin:10px;
}

「.hoge dd dd」の代わりに「.hoge dl dd dl dd」でも有効になります。

試された方法でうまくいかなかった理由は、入れ子の指定の中にdtを入れているためだと思います。もし <dt><dd></dd></dt> となっているなら指定された方法で有効になりますが、実際には <dt></dt><dd></dd> のようにdtとddは同じ階層にありますから、入れ子の指定に入れてはいけないのです。

QVBサンプルソースの使い方

VBサンプルソースの使い方
http://km2net.com/usb-an/index.shtml
Km2NetのUSB-Anを利用するため、
VBサンプルソースをDLしたのですが、
拡張子bas、frm、vbpなどのファイルをアプリケーションとして
利用する方法が分かりません。

VBが必要なのかと思って、
MS Visual Basic 2010 Express をインストールしてみたものの
使い方が分からなくて・・・。

どなたかご教授ください。

Aベストアンサー

VB6.0のサンプルプログラムですね。

MS Visual Basic 2010 Express では実行ファイルを作ることはできません。

VB6.0を使って実行ファイルをつくるか、VB6.0上で実行しますから、VB6.0(既に発売していないと思います)を持っていない場合は、ソースをエディタで見てソースを参考にして VS 2010 で作り直すしかないですね。

MSDNサブスクリプションを購入すれば VB6.0もダウンロードできますが安くはないです。

VB6.0を持っている人に実行ファイルを作ってもらう方法もありますが。

Qdl,dt,ddタグでdtに対して、rowspan

お世話になっております。
表題の通り、
dl,dt,ddタグでdtに対して、rowspanってできませんか?
cssは記述しておりませんが、
現在、テーブルのように2列並んだ状態です
イメージ(http://www.geocities.jp/eijispace/2011/0810.html)

<dl>
<dt>天気</dt>
<dd>晴れ</dd>
<dt>天気</dt>
<dd>曇り</dd>
<dt>天気</dt>
<dd>雨</dd>
</dl>

これを天気の部分は縦に一つに纏めて表示したいのです。

tableタグでも良いのですが、
レスポンシブ化を計っており、
ウインドウサイズが小さくなると、
一列に表示ということがしたく、

ウインドウサイズが小さくなると
jsか何かで、rowspanを0にする

という方法でも良いのですが、
jsは余り使わず、mediaクエリで何とかならないものか考えております。

ご教授お願いします

Aベストアンサー

ということは、端(ハナ)からデータ構造は
<dl>
 <dt>天気</dt>
 <dd>晴れ</dd>
 <dd>曇り</dd>
 <dd>雨</dd>
</dl>
ですよ。
<ul>
 <li>天気
  <ol>
   <li>晴れ</li>
   <li>曇り</li>
   <li>雨</li>
  </ol>
 </li>
</ol>
かもしれない。
 そもそも、最初に示された
<dl>
<dt>天気</dt>
<dd>晴れ</dd>
<dt>天気</dt>
<dd>曇り</dd>
<dt>天気</dt>
<dd>雨</dd>
</dl>
だと、3行目<dt>天気</dt>の以降の内容は、最初の<dt>の子供じゃないですから、そのようなデザインと整合性が取れません。

 まあ、方法はなくはありません。
以下は、本来の手法ではありません。
★タブは_に置換してある。

<div class="section">
_<h2>見出し</h2>
_<p>・・・</p>
_<dl>
__<dt>天気</dt>
__<dd>晴れ</dd>
__<dt>天気</dt>
__<dd>曇り</dd>
__<dt>天気</dt>
__<dd>雨</dd>
_</dl>
</div>


div.section dl,div.section dl dt,div.section dl dd{
display:block;
margin:0;padding:0;
}
div.section dl{width:60%;margin:0 auto;position:relative;border:solid 1px black;
}
div.section dl dd{margin-left:61px;border-left:1px solid black;padding:0.5em 5px;}
div.section dl dt+dd+dt+dd{border-top:1px gray solid;line-height:1.6em;text-indent:1em;}
div.section dl dt{
position:absolute;
top:0;left:0;
width:40px;
height:100%;
border:none;
padding:0.5em 10px;
}
/* mediaquery以下を有効にする。 */
/*
div.section dl{padding-top:30px;}
div.section dl dd{margin-left:0;border-left-width:0;}
div.section dl dt{width:90%;height:14px;}
div.section dl dd{border-top:1px gray solid;}

リキッドなので、mediaqueryは必要ないかと・・・

ということは、端(ハナ)からデータ構造は
<dl>
 <dt>天気</dt>
 <dd>晴れ</dd>
 <dd>曇り</dd>
 <dd>雨</dd>
</dl>
ですよ。
<ul>
 <li>天気
  <ol>
   <li>晴れ</li>
   <li>曇り</li>
   <li>雨</li>
  </ol>
 </li>
</ol>
かもしれない。
 そもそも、最初に示された
<dl>
<dt>天気</dt>
<dd>晴れ</dd>
<dt>天気</dt>
<dd>曇り</dd>
<dt>天気</dt>
<dd>雨</dd>
</dl>
だと、3行目<dt>天気</dt>の以降の内容は、最初の<dt>の子供じゃないですから、そのようなデザインと整合性が取れません...続きを読む

QVB6でシリアル通信サンプルソースの入手先は

お世話になっております、
VB6でシリアル通信(UART)を行うための、
サンプルソースをダウンロードできるサイトをご存知の方いましたら、
教えていただけないでしょうか。

有料やアプリは見つけたのですが、
無料のソースが見つけられませんでした、
希望としてはMSCommを使用している物をご紹介していただけないでしょうか

Aベストアンサー

Visual Studio 6 のサンプルプログラムの中に
「VBTerm」という通信プログラムが有ります。
(エディションによっては入っていないかも)

QHTMLタグのDL DT DDを使ってliやulの代わり

HTMLタグのDL DT DDを使ってliやulの代わりをしようとしていますが、
liの
list-style-image: url("test.gif");
がDL DT DDで表現できません。

違った方法で表示できるのでしょうか?

それとも不可能なのでしょうか?

Aベストアンサー

できると思いますよ。
その場合、line-heightを消して画像の高さを一緒にしてやる方が良いかも知れません。

QVB.NETで<Input>タグ、<textarea>タグに値を代入するには?

VB.NET+Javascriptでプログラミングしているのですが、HTMLに<input>タグ(type=text)、<textarea>タグがありまして、これに値を代入する方法がわかりません。
おしえてくださいーー
※該当タグにJavascriptを使うので、VBのテキストボックスはつかえません><

Aベストアンサー

-------------------------------------------------------------------
まず最初に、この#6の発言は、#5のサンプルソースとセットでの発言です。
1発言内に入りきらなかったので、発言を分割いたしました
-------------------------------------------------------------------

個人的に「JAVAが未経験だからわからないからって、放置する」というのが悔しいので、調査を続けております。


んで、以下の履歴を発見しました。

[167764:テキストボックスに文字挿入したい]
http://okwave.jp/kotaeru.php3?q=167764


フォーカスを持っている間に、カーソル位置を記憶しておく必要があるようです。
そして、このようなサンプルも見つけました。
http://mugi.cc/js/000603.htm


VBでいうパブリックな変数[n]に位置を保存し、ボタン押下時に、その記憶位置を利用し、挿入を行っているようです。
これであれば、テキストやテキストエリア数の変数や配列を持たせ、管理する必要があります。


なので、サンプルを作成しました。
・起動時に「テキスト」/「テキストエリア」を対象エレメントを取得
・その[対象エレメント.ID] + _'hidden'というIDを持った「新規エレメント」を、非表示で作成
・対象エレメントに[onkeyup]と[onmouseup]のイベントハンドラを追加
・イベントハンドラにより得たタイミングで、カーソルの位置を記憶
・「挿入実行ボタン」押下時に、記憶したカーソル位置から、改行コード変換処理を施し、挿入実行
という流れです。

※※※※※※※※※※※※※※※※※※※※※※※
個人的に「業務でのJAVAの経験があまり無いので、
わかる方がいたら、是非修正して欲しい」です。
※※※※※※※※※※※※※※※※※※※※※※※

もし、ボタンがサーバ側であれば、以前のサンプルの方法により、JAVAを発行してあげればよいと思っております。
うまく走るかどうかは実験しておりませんが。。。。


注意!!
#5のソースを一度テキストエディタに落としてください。
その後、以下のいずれかの置換をしてください。
・全角の四角『□』2個を、TAB文字1個
・全角の四角『□』1個を、半角スペース2個
その後、ほげほげ.aspxの中に組み込んでください。

-------------------------------------------------------------------
まず最初に、この#6の発言は、#5のサンプルソースとセットでの発言です。
1発言内に入りきらなかったので、発言を分割いたしました
-------------------------------------------------------------------

個人的に「JAVAが未経験だからわからないからって、放置する」というのが悔しいので、調査を続けております。


んで、以下の履歴を発見しました。

[167764:テキストボックスに文字挿入したい]
http://okwave.jp/kotaeru....続きを読む

QDL,DT,DDタグについて

HTMLのタグで"DL"(定義リスト)、"DT"(定義される用語)、"DD"(定義の内容)というのがあるのですが、実際どういう使い方をするのでしょうか。
表示をみると単なる見出しと箇条書きって感じなんですが、特別な意味があるのでしょうか?
ご存知の方、教えていただけますか<m(__)m>

Aベストアンサー

そんな感じの意味合いでいいと思いますよ。
詳しい説明は「とほほのWWW入門」の中に
ありますのでそちらをご覧ください。

http://tohoho.wakusei.ne.jp/html/dl.htm

参考URL:http://tohoho.wakusei.ne.jp/html/dl.htm

QVBで帳票するサンプル

Visual Studio Express 2012 for Windows DesktopでVBを使って帳票のプログラムを作ろうとしています。

サンプルソースがあればご紹介ください。

できれば、外部ツールを使わずに、追加費用が発生しない範疇で制作したいです。

Aベストアンサー

とりあえず、自力で文字を印刷する方法です。(ツールは一切使わない)
URLの「印刷する」や「文字列を印刷する」を見てください。

参考URL:http://dobon.net/vb/dotnet/graphics/index.html

QWinIE(5以降)で、ddタグをCSSで制御すると、ずれてしまいます。

WinIE(5以降)で、ddを下記のCSSで制御すると、「取締役/」と書かれた文字から先が、
前に3pxほどずれてしまいます。
----------------------------------------------------
<html><head><title>dl組</title>
<style type="text/css">
<!--
#works dl, dt, dd {font-size: 12px; line-height: 1.5em; margin: 0px; padding: 0px;}
#works dt {padding: 0 0 5px 0; float: left;}
#works dd {margin: 0 0 0 5.5em; padding: 0 0 5px 0;}
-->
</style>
</head>

<body>
<div id="works">
<dl>
<dt>会社創業</dt>
<dd>昭和63年2月1日</dd>
<dt>改組設立</dt>
<dd>平成15年3月1日</dd>
<dt>役員</dt>
<dd>代表取締役社長/あいうえお<br>
常務取締役/かきくけこ<br>
<!-- ここから -->
取締役/さしすせそ<br>
取締役/たちつてと<br>
取締役/なにぬねの<br>
取締役/はひふへほ</dd>
<!-- ここまで -->
</dl>
</div>
</body></html>
----------------------------------------------------

そこで下記のCSSを追加して、いちよう解決したのですが、何かすっきりしません。

----------------------------------------------------
#works dd .sage {padding: 0 0 0 3px;} /* WinIE用 */
html>body #works dd .sage {padding: 0;} /* WinIE以外用 */

<!-- ここから -->
<div class="sage">取締役/さしすせそ<br>
取締役/たちつてと<br>
取締役/なにぬねの<br>
取締役/はひふへほ</div></dd>
<!-- ここまで -->
----------------------------------------------------

これ以外の方法で、もうちょっとシンプルに解決する方法はないでしょうか。
よろしくお願いします。

WinIE(5以降)で、ddを下記のCSSで制御すると、「取締役/」と書かれた文字から先が、
前に3pxほどずれてしまいます。
----------------------------------------------------
<html><head><title>dl組</title>
<style type="text/css">
<!--
#works dl, dt, dd {font-size: 12px; line-height: 1.5em; margin: 0px; padding: 0px;}
#works dt {padding: 0 0 5px 0; float: left;}
#works dd {margin: 0 0 0 5.5em; padding: 0 0 5px 0;}
-->
</style>
</head>

<body>
<div id="works">
<dl>
<dt>...続きを読む

Aベストアンサー

・前回の回答ですが、長さが指定できるなら長さの方がシンプルになります。(高さの指定はなくても大丈夫)

・dl の compactって対応してないブラウザが結構あります。
NN6以降(他gecko使用ブラウザ)とか、Operaとか。safariとかMac系はよく知らないけど。
HTML4.01ではDeprecatedに指定されてるし、compact属性の将来は暗いかも。
(でも、スタイルシートのdisplay:compactに対応するようになったらちゃっかりcompact属性にも対応するかも。)

・見ようによっちゃ、表にもみえるしtableでもいいのかも。

Qロジスティック曲線作成 vb6サンプルプログラム

ロジスティック曲線作成 vb6サンプルプログラム

お世話になります

vb6でロジスティック曲線の値を求めるサンプルソースを探しております。

サンプルを元に作成したい処理は以下となります

右上がり(右増分)の曲線

サンプルの計算式があれば、以下の様に改造を考えております

引数は
YMax : 縦軸の最大値
XMax : 横軸の最大値
T_Val : 閾値
Table(XMax) : 戻り値

言葉で説明すると
YMaxが100ならば、求める値の増分幅は0~100で
XMaxが200ならば、Table(200)に100が入る
T_Valが小さければ、比例に近く
T_Valが大きければ、曲線がきつくなる
T_Valの範囲はサンプルソース依存で構いません

Aベストアンサー

ロジスティック曲線の性質上、

>XMaxが200ならば、Table(200)に100が入る
>T_Valが小さければ、比例に近く
>T_Valが大きければ、曲線がきつくなる

とするのは難しいと思います。

蛇足ですが、
ベジェ曲線ですと、上記のようなものができそうです。
ただし、xとyの関係が媒介変数(t)を介しての記述となるため、xが○のときyは●、という計算が簡単にはできません。

以下サンプルです。
エクセルVBAです。
B1セルにXMax、B2セルにYMax、B3セルにT-Val(ゼロ以上1以下)を入力してください。
マクロ実行すると、A7セル以下にxの値、B7セル以下にyの値が表示されます。

----------------

Sub test()

x1 = 0
y1 = 0
x4 = Cells(1, 2)
y4 = Cells(2, 2)

x2 = (x4 - x1) * Cells(3, 2)
y2 = y1
x3 = (x4 - x1) * (1 - Cells(3, 2))
y3 = y4

div = x4

For i = 0 To div
t = i / div
tp = 1 - t

x = t * t * t * x4 + 3 * t * t * tp * x3 + 3 * t * tp * tp * x2 + tp * tp * tp * x1
y = t * t * t * y4 + 3 * t * t * tp * y3 + 3 * t * tp * tp * y2 + tp * tp * tp * y1

Cells(7 + i, 1) = x
Cells(7 + i, 2) = y
Next

End Sub

ロジスティック曲線の性質上、

>XMaxが200ならば、Table(200)に100が入る
>T_Valが小さければ、比例に近く
>T_Valが大きければ、曲線がきつくなる

とするのは難しいと思います。

蛇足ですが、
ベジェ曲線ですと、上記のようなものができそうです。
ただし、xとyの関係が媒介変数(t)を介しての記述となるため、xが○のときyは●、という計算が簡単にはできません。

以下サンプルです。
エクセルVBAです。
B1セルにXMax、B2セルにYMax、B3セルにT-Val(ゼロ以上1以下)を入力してください。
マクロ実行する...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング